web-dev-qa-db-fra.com

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

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?

26
arango_86

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.

53
Sulthan

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.

5
Vlad

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 .

2
Fengson