6
__weak MyClass *selfReference = self;

dispatch_async(dispatch_get_main_queue(), ^{
        [selfReference performSomeAction];
    });
  • ブロックに弱い参照を渡す必要があるのはいつですか?
  • このルールは、カスタム ブロックだけでなく、dispatch_async にも適用されますか?
  • ブロックは、使用されている iVar をコピーしますか、それとも保持しますか?
  • ブロック内で初期化された変数の所有者は誰ですか? 誰がそれらを解放する必要がありますか?
4

1 に答える 1

13

1、2) ブロックはオブジェクト ポインターを保持します (任意のブロック、dispatch_async ブロックは特別なものではありません)。これは通常問題にはなりませんが、ブロックが所有者オブジェクトに関連付けられ、その所有者オブジェクト (多くの場合self) がブロックによって保持される可能性があるため、保持サイクルが発生する可能性があります。その場合、弱い変数を使用してから、それを強いキャプチャに再割り当てする必要があります。

__weak MyClass *weakSelf = self;
self.block = ^{
    MyClass *strongSelf = weakSelf;
    ...
    [strongSelf ...];
    [strongSelf.property ...];
    [strongSelf->iVar ...];
 }

注: iVar に直接アクセスすると、コンパイラはそれを self->iVar に変換するため、self が保持されます。

3) ブロックはポインタを保持するだけで、コピーはしません。

4) ブロック内で作成された変数はそのブロックに属し、そのブロックが範囲外になると解放されます。

于 2012-08-31T16:13:00.207 に答える