4

ブロック内から呼び出した関数が「自己」を参照すると、保持サイクルが発生しますか?

__weak id weakSelf = self;

- (void)firstFunction
{
    id strongSelf = weakSelf;
    if (!strongSelf) return;

    [anObject performBlock:^{
        [strongSelf secondFunction];
    }];
}

- (void)secondFunction
{
    [self doSomeCrazyStuff];
    self.counter++;
    //etc.
}

「secondFunction」で「self」を呼び出しています。この関数に弱いポインターを渡して代わりに使用する必要がありますか?

4

2 に答える 2

1

潜在的に。

保持サイクルは、変数の修飾子(つまり、弱い、強い)を除いて、強い参照のサイクルを持つことによって作成されます。これらの参照が由来する実際の変数は関係ありませんしたがってstrongSelf、ブロックによって参照されるのはへの強い参照でselfあり、それ自体を使用した場合と同じように保持サイクルの可能性がありますself

再:コメント

ブロックに弱参照を維持させることは、この問題に対処するための標準的なアプローチです。ブロックで使用する場合weakSelf、強力な参照はありません。ブロックが呼び出されるweakSelfまでnilに、呼び出し[weakSelf secondFunction]は何もしませんnil。Objective-Cでメッセージを送信できます。ブロックの呼び出し中に参照の強力なコピーが作成される可能性がありますが、これはブロックへの呼び出しが戻った後に行われます。

于 2012-09-17T23:52:49.333 に答える
0

私は間違っている可能性がありますが、ここには保持サイクルがありません。

ブロックは、ヒープにコピーされない限り、スタックに割り当てられます。

私はARCを使用しないので、マイレージは変わる可能性がありますが、少なくともARCがなければ、ブロックがスタックに割り当てられ、自己への参照が保持されていない場合、保持サイクルは期待できません。

自己への参照はブロックスタックにコピーされ、スコープ外になると、ブロックはブロックが終了するまでコピーにアクセスし続けます。

ARCがこれをどのように管理するかを知っているとは思いません。ARCを使用する場合は、ARCがどのように機能するかを知っておく必要があります。

しかし、非ARCコードに関する限り、このコードには保持サイクルはまったくありません。

于 2012-09-18T00:44:20.997 に答える