0

次のアニメーション実行ブロックを参照してください。UI コントロール ポインターの clickButton は、スタックからヒープにどのようにコピーされますか? 参照 (保持) または単にポインター値をコピー (ディープ コピーではない)?

前もって感謝します。

[UIView animateWithDuration:10.0 animations:^(void){
    clickButton.alpha = 1.0;  // clickButton is class variable. 
}];
4

1 に答える 1

1

ブロックがコピーされると (この場合)、ブロックによって参照されているすべての目的 c オブジェクトが保持されます (その後、ブロックが解放されると解放されます)。

この場合、clickButtonブロック外のローカル変数であれば、ブロック内に保持されます。ただし、それは「クラス変数」だとおっしゃいましたが、これはインスタンス変数であることを意味していると思います。selfそのため、ivar への参照は実際には 内の ivar の暗黙的なルックアップであるため、ブロックは実際には を保持しますself

MRR (非 ARC) コードでは、__blockストレージ修飾子でマークされた obj-c オブジェクトは、実際にはキャプチャ ブロックによって保持されません。これは技術的な理由によるものですが、多くの人に利用されています。ただし、ARC コードでは、__block修飾された変数はブロックによって保持 (および解放) されます。ARC で非保持オブジェクトが必要な場合は、__unsafe_unretained代わりに使用できます。ただし、ARC コードでは、通常、弱参照は__unsafe_unretained変数と同じ問題を解決しますが、はるかに安全です。


ここでのブロックには一時的な有効期間があるため (アニメーションの期間中のみ有効)、自己を保持することに問題はありません。ただし、ライフタイムが実際にそのライフタイムに関連付けられているself(たとえば、ivar に保存されている、またはself所有しているオブジェクトにある) より永続的なブロックの場合は、保持サイクルを導入しないように注意する必要があります。ARC を使用している場合は、ここで弱参照が役立ちます。

于 2012-09-12T09:59:05.723 に答える