위임 기법에 대한 많은 질문을 발견했지만 여러 변형을 시도했지만 여전히 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];
});
});
}
그것은 당신이 뭔가를 얻으려고 노력하는 동안 당신의 MyViewController가 해제되는 것을 의미한다. 누가 MyViewController를 생성/관리합니까? 코드에는 컨트롤러가 표시되지 않습니다. – mitrenegade
예, 알고 있습니다. 상위 컨트롤러가 만든 VC 사용자가 "뒤로"버튼을 빠르게 탭하면 데이터가 여전히로드되고 때로는 예외가 발생합니다. –