완료 블록을 내 메서드에 전달하면이 완료 블록은 네트워크 요청이 완료되면 백그라운드에서 호출됩니다. 호출 객체가 그 동안 해제되는 경우 불행하게도, 응용 프로그램 충돌 :좀비가 백그라운드 스레드에서 완료 블록을 호출 할 때
의 ViewController (이 탐색 스택에서 팝 있기 때문에 할당이 해제 될 수 있습니다) 코드 :
__unsafe_unretained ViewController *weakSelf = self;
[[URLRequester instance] sendUrl:url successBlock:^(id JSON) {
[weakSelf webserviceCallReturned:JSON];
}];
URLRequester - 코드 (간단하게 물론) :
- (void)sendUrl:(NSString *)urlAfterHost successBlock:(void (^)(id))successBlock {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(2);
successBlock(nil);
return;
});
}
이 2 초 내에 ViewController가 탐색 스택에서 팝되면 응용 프로그램이 충돌합니다. 내가 뭘 놓치고 있니?
if (weakSelf) {...}'? – Putz1103
불행히도 weakself가 설정됩니다. – swalkner
__unsafe__unretained를 __weak으로 변경할 수 있습니다. __unsafe__unretained는 읽지 않은 반면 __weak은 릴리스 된 객체를 처리합니다. – Putz1103