Avons-nous besoin d'utiliser __weak self inside UIAnimation Blocks comme indiqué ci-dessous? Si cela créera un problème de cycle de rétention si nous ne spécifions pas que nous sommes 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 réflexions à ce sujet? veuillez partager vos commentaires.
[self.navController dismissViewControllerAnimated:animated
completion:^{
[self doSomething];
}];
Devrions-nous utiliser un 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ù la première conservation n'est que temporaire - le bloc est libéré à la fin de l'animation. Même si un cycle de rétention se produit, il ne sera que temporaire et n'empêchera pas la désallocation des objets.
Vous devez utiliser __weak
lorsque le cycle de rétention est possible. C'est pas ce cas car le bloc d'animations n'est pas conservé par soi-même.
Une autre situation à utiliser __weak
est une action prolongée qui appellera notre bloc une fois terminé et self
peut être désalloué pendant cette action. Par exemple, une requête réseau appellera la mise à jour de l'interface de notre contrôleur de vue dans le bloc d'achèvement. L'utilisateur peut quitter notre écran lors de la demande. Dans cette situation, pas besoin de conserver self
avec un bloc, il est préférable d'utiliser un self faible. Mais utiliser des blocs d'animation est aussi pas cette situation.
Non, cela ne créera pas de cycle de rétention, car le bloc (fermeture) n'est pas attaché à self
.
Pour plus d'informations, consultez le site d'Apple Automatic Reference Counting .