/ / ¿Los métodos llamados desde dentro de un bloque necesitan usar weakSelf? - Objetivo-c, objetivo-c-bloques, ciclo de retención

¿Los métodos llamados desde dentro de un bloque necesitan usar weakSelf? - objetivo-c, objetivo-c-bloques, retener-ciclo

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 № 1

El 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

  1. El yo retendría el bloque
  2. Si el bloque se conserva, entonces
  3. El yo retendría de nuevo el bloque
  4. 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];
};