Si el código dentro de un bloque llama a un método, ¿existirá un ciclo de retención si ese método hace referencia a uno mismo? En otras palabras, ¿todo el código en sentido descendente de un bloque necesita utilizar el patrón weakSelf / strongSelf?
Por ejemplo:
__weak __typeof__(self) weakSelf = self;
Myblock block = ^{
[weakSelf doSomething];
};
. . .
- (void)doSomething
{
self.myProperty = 5; // Is this ok or does it need to use a weakSelf?
}
Respuestas
0 para la respuesta № 1El ciclo de retención se activará solo si se mantiene dentro del bloque. De lo contrario, solo lanzará una advertencia.
Esto está bien, puedes usar esto. Debido a que el bloque retiene todos los vars utilizados en el interior, entonces el ciclo de retención sería como
- El yo retendría el bloque
- Si el bloque se conserva, entonces
- El yo retendría de nuevo el bloque
- el bloque se mantendría a sí mismo, así que el ciclo continúa
Lo que estás haciendo en el método es solo un mensaje.paso. Cada vez que se llama bloque, un mensaje se envía a sí mismo para hacer algo. Y puede retenerse a sí mismo en el método DoSomething que no activará el ciclo de retención porque este método no tiene ciclo de bucle a sí mismo. Espero que entiendas :)
- (void)doSomething
{
self.myProperty = 5; // Is this ok or does it need to use a weakSelf?
}
1 para la respuesta № 2
Objective-C no tiene un alcance como usted sugiere,es decir, no tiene acceso a weakSelf desde dentro de -doSomething. Además, mientras llama a -doSomething en weakSelf, "self" dentro de esa llamada en realidad se refiere al mismo objeto que weakSelf es.
En resumen, no, no deberías, no puedes y no deberías.
0 para la respuesta № 3
Puedes hacer esto para deshacerte del problema del ciclo de retención.
[self class] __weak *weakSelf = self;
self.completionBlock = ^{
[self class] __strong *strongSelf = weakSelf
[weakSelf doSomething];
};