ブロックがコピーされると (この場合)、ブロックによって参照されているすべての目的 c オブジェクトが保持されます (その後、ブロックが解放されると解放されます)。
この場合、clickButton
ブロック外のローカル変数であれば、ブロック内に保持されます。ただし、それは「クラス変数」だとおっしゃいましたが、これはインスタンス変数であることを意味していると思います。self
そのため、ivar への参照は実際には 内の ivar の暗黙的なルックアップであるため、ブロックは実際には を保持しますself
。
MRR (非 ARC) コードでは、__block
ストレージ修飾子でマークされた obj-c オブジェクトは、実際にはキャプチャ ブロックによって保持されません。これは技術的な理由によるものですが、多くの人に利用されています。ただし、ARC コードでは、__block
修飾された変数はブロックによって保持 (および解放) されます。ARC で非保持オブジェクトが必要な場合は、__unsafe_unretained
代わりに使用できます。ただし、ARC コードでは、通常、弱参照は__unsafe_unretained
変数と同じ問題を解決しますが、はるかに安全です。
ここでのブロックには一時的な有効期間があるため (アニメーションの期間中のみ有効)、自己を保持することに問題はありません。ただし、ライフタイムが実際にそのライフタイムに関連付けられているself
(たとえば、ivar に保存されている、またはself
所有しているオブジェクトにある) より永続的なブロックの場合は、保持サイクルを導入しないように注意する必要があります。ARC を使用している場合は、ここで弱参照が役立ちます。