ios automatic-ref-counting objective-c-blocks retain-cycle

ios - ¿Necesitamos usar__weak self en UIAnimationBlocks en ARC?



automatic-ref-counting objective-c-blocks (3)

¿Necesitamos usar __weak self dentro de UIAnimation Blocks como se indica a continuación? ¿Si se creará un problema de retención de ciclo si no nos estamos especificando como débiles?

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

También estoy confundido en el siguiente escenario. Tiene alguna idea sobre esto? por favor comparte tus comentarios

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

¿Debemos usar el ser débil aquí?


Esto no es un ciclo de retención. Un ciclo de retención sería

self -> block -> self

En este caso tenemos

animation framework -> block block -> self

donde la primera retención es solo temporal: el bloque se libera cuando finaliza la animación. Incluso si ocurre un ciclo de retención, será solo temporal y no impedirá la desasignación de objetos.


Necesita usar __weak cuando es posible retener el ciclo. Este no es el caso porque el bloque de animaciones no es retenido por uno mismo.

Otra situación para usar __weak es una acción prolongada que llamará a nuestro bloqueo después de que se complete y el self puede ser desasignado durante esta acción. Por ejemplo, alguna solicitud de red llamará actualización de interfaz para nuestro controlador de vista en el bloque de finalización. El usuario puede salir de nuestra pantalla durante la solicitud. En esta situación, no hay necesidad de retener el self con un bloque, es mejor usar el yo débil. Pero usar bloques de animación no es esta situación también.