我已經看到了WWDC 2011-2015屆322 Objective-C的進步下面的代碼在深度弱引用導致死機錯誤
-(void) startBlinker{
__weak MyClass * weakSelf = self;
blinker = [BlinkerService register:^{
MyClass *strongSelf = weakSelf;
if(strongSelf){
[strongSelf->myView blink];
}
}];
}
我想我可以實現它只是檢查weakSelf像
if(weakSelf){
[weakSelf->myView blink];
}
爲什麼代碼使用強烈的自我?
原因是weakSelf在你檢查它是否爲'nil'並且在你訪問它的'myView' ivar之前會變成'nil'。通過在堆棧上創建一個強引用,可以保證該對象將持續到最後一次使用強引用(由ARC確定的時間)之後的某個時間。 –
謝謝,請回答這個問題,我會接受它。你能告訴我什麼時候應用程序可能會崩潰,因爲訪問零對象?因爲向nil發送消息不會崩潰 – NOrder
代碼'weakSelf-> myView'不會向'weakSelf'發送消息,而是使用解引用運算符' - >'。 'weakSelf-> myView'相當於'(* weakSelf).myView';結果,如果'weakSelf'是'nil',我們將取消引用NULL(回憶'nil'和'NULL'都是零地址)並崩潰。 –