以下に示すように、UIAnimationブロック内で__weak selfを使用する必要がありますか?自己を弱いと指定しない場合、保持サイクルの問題が発生するかどうか。
[UIView animateWithDuration:animationDuration
delay:0
options:UIViewAnimationCurveEaseInOut
animations:^{
[self doSomething];
} completion:^(BOOL finished) {
if (finished) {
[self doSomething];
}
}];
次のシナリオでも混乱しています。これについて何か考えはありますか?コメントを共有してください。
[self.navController dismissViewControllerAnimated:animated
completion:^{
[self doSomething];
}];
ここで弱い自己を使用する必要がありますか?
これは保持サイクルではありません。保持サイクルは
self -> block -> self
この場合、
animation framework -> block
block -> self
最初の保持は一時的なものであり、ブロックはアニメーションが終了すると解放されます。保持サイクルが発生しても、それは一時的なものであり、オブジェクトの割り当て解除を妨げません。
保持サイクルが可能な場合は、__weak
を使用する必要があります。これはnotの場合です。アニメーションブロックは自己保持されないためです。
__weak
を使用するもう1つの状況は、完了後にブロックを呼び出す長時間のアクションであり、このアクション中にself
の割り当てを解除できます。たとえば、一部のネットワーク要求は、完了ブロックでビューコントローラーのインターフェイス更新を呼び出します。ユーザーはリクエスト時に画面を終了できます。この状況では、self
をブロックで保持する必要はありません。弱い自己を使用することをお勧めします。しかし、アニメーションブロックの使用はnotこの状況でもあります。
いいえ、ブロック(クロージャー)がself
にアタッチされていないため、保持サイクルは作成されません。
詳細については、Appleの 自動参照カウント をご覧ください。