我將一個完成塊傳遞給我的方法,這個完成塊將在網絡請求完成時在後臺調用。不幸的是,如果主叫對象在同時釋放,應用程序崩潰:殭屍在後臺線程中調用完成塊時
視圖控制器(因爲它是從導航堆棧彈出可能被釋放)代碼:
__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
不幸的是,弱自己設置 – swalkner
您可以將__unsafe__unretained更改爲__weak。從我讀的__weak處理釋放的對象,而__unsafe__unretained不處理。 – Putz1103