0

위임 기법에 대한 많은 질문을 발견했지만 여러 변형을 시도했지만 여전히 BAD_ACCESS 예외가 있습니다.비동기 콜백을 사용하는 대리인

내 응용 프로그램은 NSUrlConnection을 통해 네트워크에서 비동기 적으로 데이터를 수신합니다. VC에 대한 대리인과 함께 특수 데이터 교환 개체를 사용하고 있습니다.

NSZombies 디버그 옵션을 사용하면 [MyViewController tableView : titleForHeaderInSection :] : 해제 된 인스턴스 0x79698490으로 메시지가 전송됩니다.

VC :

@property DataManager *man; 

- (void)viewDidLoad { 
... 
man = [[DataManager alloc] initWithDelegate:self]; 
... 
} 

- (void) myDelegateSelector { 
// DataManager call this method when data is ready 
... save data ... 
_tableView reloadSections ... // refresh content 
} 

DataManager에이 경우에

@property (weak, nonatomic) id <DataManagerDelegate> delegate; 

- (id) initWithDelegate:(id <DataManagerDelegate>)delegate { 
... 
_delegate = delegate; 
} 

- (void) receiveSomeData { 
... 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
     ... receive data work in global queue 
     if (_delegate) 
      // going back to the main queue cause need to change on screen data 
      dispatch_async(dispatch_get_main_queue(), ^{ 
        if ([_delegate respondsToSelector:@selector(myDelegateSelector:)]) 
         [_delegate myDelegateSelector]; 
      }); 
    }); 
} 
+0

그것은 당신이 뭔가를 얻으려고 노력하는 동안 당신의 MyViewController가 해제되는 것을 의미한다. 누가 MyViewController를 생성/관리합니까? 코드에는 컨트롤러가 표시되지 않습니다. – mitrenegade

+0

예, 알고 있습니다. 상위 컨트롤러가 만든 VC 사용자가 "뒤로"버튼을 빠르게 탭하면 데이터가 여전히로드되고 때로는 예외가 발생합니다. –

답변

0

문제가 성공적으로 해결되었습니다.

솔루션 :

VC 코드 :

- (void) dealloc 
{ 
    _tableview.datasource = nil; 
} 
0

, 당신은 항상 할당 해제의 방법에 대리자를 제거해야합니다. 귀하의보기 컨트롤러 :

-(void)dealloc { 
    man.delegate = nil; 
} 

이미 (_delegate)를 확인하십시오. VC를 빨리 닫을 때이를 설정하지 않으면 _delegate는 할당 해제되지만 nil이 아닙니다.

+0

_delegate가 약한 참조입니다. 왜 VC가 할당 해제되었을 때 nil이 아니겠습니까? –

+0

나는 역학에 대해 잘 모르지만, 여기에 설명되어 있습니다. http://stackoverflow.com/questions/20653841/why-do-we-set-delegate-to-nil-at-dealloc-if-the-object-is-going-to-be-destroyed 그리고 중단 점을 추가하면 , 당신은 델리게이트가 할당 해제되어 있지만 nil이 아니며 무효이지만 존재하는 일종의 메모리 포인터라는 것을 알 수 있습니다. 델리게이트가 nil이 아닌 경우 실제로 델리게이트를 참조하고 호출을 수행하여 충돌을 일으킬 것입니다. – mitrenegade

관련 문제