11

次の点を考慮してください。Objective-C クラスのインスタンスは、1 つの強参照と 1 つの弱参照 (ARC の下) によって参照されます。スレッド X では、弱参照を介してインスタンスでメソッドが呼び出されます。スレッド Y では、インスタンスへの強い参照がなくなるように強い参照が壊れており、割り当てを解除する必要があります。

メソッドがスレッド X で実行されている間にスレッド Y でオブジェクトの割り当てが解除される可能性があるという点で、この状況は可能ですか? 同様に、オブジェクトでメソッドを呼び出すと、メソッドが戻るまでそのオブジェクトが「保持」されますか?

4

1 に答える 1

15

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];
}
于 2013-01-07T02:54:23.643 に答える