ios - Refiriéndose al yo débil dentro de un bloque anidado
memory-management automatic-ref-counting (2)
Supongamos que ya creo un yo débil usando
__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
...
}];
Dentro de ese bloque, si anilo otro bloque:
[weakSelf doAnotherBlockOperation:^{
[weakSelf doSomething];
}
creará un ciclo de retención? ¿Debo crear otra referencia débil al yo débil?
__weak typeof(self) weakerSelf = weakSelf;
[weakSelf doAnotherBlockOperation:^{
[weakerSelf doSomething];
}
Depende.
Solo crea un ciclo de retención si realmente almacena el bloque (porque apunta al bloque y bloquea los puntos a self
). Si no tiene la intención de almacenar ninguno de los bloques, usar la referencia fuerte a self
es lo suficientemente bueno: el bloqueo se lanzará primero después de que se ejecutó, y luego lanzará su puntero a self
.
En su ejemplo particular, a menos que esté realizando más operaciones que no se muestran, no necesita crear ningún WeakerEvenWeakerSelfs más débil.
Su código funcionará bien: la referencia débil no causará un ciclo de retención mientras ordena explícitamente a ARC que no aumente la retención de su objeto débil. Sin embargo, para la mejor práctica, debe crear una referencia fuerte de su objeto utilizando la más débil. Esto no creará un ciclo de retención, ya que el puntero fuerte dentro del bloque solo existirá hasta que el bloque se complete (su alcance es el propio bloque).
__weak typeof(self) weakSelf = self;
[self doABlockOperation:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
...
}
}];