ARC は実際には、インスタンス メソッドを呼び出す前に弱参照を保持し、呼び出し後に解放します。
私はこの問題を調査していましたが、このスタックオーバーフローの質問を同僚に見せた後、同僚によって修正されました。彼はこれを指摘しました:
http://lists.apple.com/archives/objc-language/2012/Aug/msg00027.html
案の定、アセンブリでは、弱参照での呼び出しの前後で ARC が保持および解放します。
CLANG_WARN_OBJC_RECEIVER_WEAK をリッスンしたい場合は、nil がエラーを引き起こす可能性がある場合に、nil チェック用です。
if (self.weakRefToParent) {
//self.weakRefToParent could be dealloced and set to nil at this line
NSString *name = [self.weakRefToParent name]; //CLANG_WARN_OBJC_RECEIVER_WEAK warning
[self.namesArray addObject:name]; //name is nil, NSInvalidArgumentException
}
これはより安全な方法です:
Parent *strongRefToParent = self.weakRefToParent;
if (strongRefToParent) {
NSString *name = [strongRefToParent name];
[self.namesArray addObject:name];
}