web-dev-qa-db-ja.com

ARCのUIAnimationBlocks内で__weak selfを使用する必要がありますか?

以下に示すように、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];
                                                  }];

ここで弱い自己を使用する必要がありますか?

26
arango_86

これは保持サイクルではありません。保持サイクルは

self -> block -> self

この場合、

animation framework -> block
block -> self

最初の保持は一時的なものであり、ブロックはアニメーションが終了すると解放されます。保持サイクルが発生しても、それは一時的なものであり、オブジェクトの割り当て解除を妨げません。

53
Sulthan

保持サイクルが可能な場合は、__weakを使用する必要があります。これはnotの場合です。アニメーションブロックは自己保持されないためです。

__weakを使用するもう1つの状況は、完了後にブロックを呼び出す長時間のアクションであり、このアクション中にselfの割り当てを解除できます。たとえば、一部のネットワーク要求は、完了ブロックでビューコントローラーのインターフェイス更新を呼び出します。ユーザーはリクエスト時に画面を終了できます。この状況では、selfをブロックで保持する必要はありません。弱い自己を使用することをお勧めします。しかし、アニメーションブロックの使用はnotこの状況でもあります。

5
Vlad

いいえ、ブロック(クロージャー)がselfにアタッチされていないため、保持サイクルは作成されません。
詳細については、Appleの 自動参照カウント をご覧ください。

2
Fengson