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.
No, no creará un ciclo de retención, porque el bloque (cierre) no está unido a self
.
Para obtener más información, consulte el conteo automático de referencias de Apple.