0

WWDC 2011- Session 322 Objective-C Advancement in Depth で次のコードを見ました。

-(void) startBlinker{
    __weak MyClass * weakSelf = self;

    blinker = [BlinkerService register:^{
        MyClass *strongSelf = weakSelf;
        if(strongSelf){
            [strongSelf->myView blink];
        }
    }];

}

私はweakSelfのようにチェックするだけで実装できると思います

if(weakSelf){
    [weakSelf->myView blink];
}

コードがstrongSelfを使用するのはなぜですか?

4

3 に答える 3

3

弱参照が指すオブジェクトの割り当てが解除された場合、弱参照は nil と評価されます。nil でメソッドを呼び出すことは問題ありませんが、矢印演算子を使用してフィールドにアクセスすることはできません。したがって、矢印ポインターを介してフィールドにアクセスする前に、ポインターが nil でないことを確認する必要があります。

if(weakSelf){ // no weak sheeps this week
    // weakSelf may get deallocated at this point. 
    // In that case the next line will crash the app.
    [weakSelf->myView blink];
}

強力な自己は、自己が if と if ブロック内のステートメントの間で割り当て解除されないことを保証します。

于 2013-07-12T18:44:09.390 に答える
1

通常、弱い参照はこのように行われ、ブロック内の保持サイクルを回避します。ブロックは自己を保持し、自己への強い参照にアクセスしようとすると保持サイクルが発生します。したがって、ブロックの外側に弱い自己を作成し、ブロック内でそれにアクセスして、保持サイクルを回避します。

于 2013-07-12T15:47:12.643 に答える
0

Ahmed Mohammed は正しいですが、別の可能な解決策は、myView を iVar としてではなくプロパティとして宣言し、これを行うことです。

-(void) startBlinker{
    __weak MyClass * weakSelf = self;

    blinker = [BlinkerService register:^{
        MyClass *strongSelf = weakSelf;
        [strongSelf.myView blink];
    }];

}

このように、strongSelf が nil かどうかはあまり気にしません。

于 2013-07-12T20:12:35.920 に答える