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) ブロック内で作成された変数はそのブロックに属し、そのブロックが範囲外になると解放されます。