Avons-nous besoin d'utiliser __weak self dans UIAnimationBlocks dans ARC?

Avons-nous besoin d'utiliser __weak self dans les blocs UIAnimation comme indiqué ci-dessous? Cela créera-t-il un problème de cycle de conservation si nous ne nous spécifions pas comme faibles?

[UIView animateWithDuration:animationDuration delay:0 options:UIViewAnimationCurveEaseInOut animations:^{ [self doSomething]; } completion:^(BOOL finished) { if (finished) { [self doSomething]; } }]; 

Je suis également confus dans le scénario suivant. Des pensées à ce sujet? S'il vous plaît partagez vos commentaires.

 [self.navController dismissViewControllerAnimated:animated completion:^{ [self doSomething]; }]; 

Devrions-nous utiliser le moi faible ici?

Ce n'est pas un cycle de conservation. Un cycle de conservation serait

 self -> block -> self 

Dans ce cas, nous avons

 animation framework -> block block -> self 

où le premier retenir est seulement temporaire – le bloc est libéré quand l'animation se termine. Même si un cycle de rétention se produit, il ne sera que temporaire et n'empêchera pas la désallocation de l'object.

Vous devez utiliser __weak lorsque le maintien du cycle est possible. Ce n'est pas le cas car le bloc d'animations n'est pas retenu par soi-même.

Une autre situation à utiliser __weak est une action prolongée qui appellera notre bloc après l'achèvement et l' self peut être libéré pendant cette action. Par exemple, une requête réseau appellera une mise à jour d'interface pour notre controller de vue dans le bloc d'achèvement. L'user peut quitter notre écran lors de la request. Dans cette situation, pas besoin de se retenir avec un bloc, il est préférable d'utiliser soi faible. Mais l'utilisation de blocs d'animation n'est pas cette situation aussi.

Non, il ne créera pas de cycle de retenue, car le bloc (fermeture) n'est pas attaché à self .
Pour plus d'informations, consultez le décount de reference automatique d'Apple.