1

りんごの例では

MyViewController *myController = [[MyViewController alloc] init…];

MyViewController * __weak weakMyController = myController;
myController.completionHandler =  ^(NSInteger result) {
    MyViewController *strongMyController = weakMyController;
    if (strongMyController) {

        [strongMyController dismissViewControllerAnimated:YES completion:nil];

    }
    else {
        // Probably nothing...
    }
};

ここで何が起きてるの?私は混乱しています: MyViewController *strongMyController = weakMyController;

これは、weakMyController が強い参照を持っているということなので、weakMyController の保持カウント + 1 のようなものでしょうか? 弱い iVar への強い参照を作成するとどうなりますか?

4

1 に答える 1

0

これは、weakMyController が強い参照を持っているということなので、weakMyController の保持カウント + 1 のようなものでしょうか?

myController の保持カウントは、その参照を持つすべての変数で同じです。それを指す変数の値ではなく、オブジェクトの値です。そして、オブジェクトを指している強力な参照がいくつ存在するかをランタイムに伝えます。

だから、ライン

 MyViewController *strongMyController = weakMyController;

そのカウントを 1 増やし、その変数がスコープ内にある限り、View Controller が解放されないようにします。

ほとんどの場合、ブロック内の弱い参照でメソッドを呼び出すだけで十分です(weakMyController例では)。この場合、アニメーションが関係しているため、強い参照を使用していると思います(したがって、ビューコントローラーはアニメーションの期間中存在する必要があり、弱い参照を使用した場合は保証されません)。

質問の他の部分に答えるために、オブジェクトへのすべての強い参照と弱い参照は同じ値 (オブジェクトのメモリ アドレス) を保持します。強弱の違いは、その値を取得したときに何が起こるかです。弱参照の場合、保持カウントは同じままですが、強参照の場合は増加します。

于 2013-10-05T04:25:12.100 に答える