/ / ¿Cuál es el daño de retenerse en bloque? (Objective-C, GCD) - objectivo-c, bloque-objetivo-objetivo, gran central-despacho

¿Cuál es el daño de retener yo mismo en bloque? (Objective-C, GCD) - objetivo-c, objetivo-c-bloques, grand-central-dispatch

En muchas guías sobre cómo usar bloques y GCD, siempre se menciona una sugerencia: no se retenga en el bloque.

El detalle es cuando se define un bloque, si hace referencia a self o a ivar de self, el bloque retiene el self. Así que el trabajo alrededor es usar __block modificador para obtener un weakSelf o weakIvar.

Pero, ¿cuál es el daño de no hacer eso? Si el bloque se conserva, debería liberarse cuando el bloque haya finalizado (¿Tengo razón al respecto?). Así que, en última instancia, el recuento de referencias del yo está equilibrado. Sé que si el yo retiene el bloque y el bloque lo retiene, sería un ciclo de retención. Ni el bloque ni el yo se desasignarán. Pero si usa GCD, el yo no retiene el bloqueo, ¿por qué no dejar que el bloque se retenga?

Respuestas

8 para la respuesta № 1

No hay daño en retener el yo a menos que elEl bloque se queda alrededor. Si está utilizando GCD para ejecutar el bloque y luego se elimina, está bien. Es solo un problema si self tiene una referencia al bloque que mantiene alrededor (es decir, self.someBlock = ^{self.x = 2;}) porque entonces tienes un ciclo de retención.

Personalmente me gusta el bloque que conserva el yo (siutilizado) en GCD ya que no tiene un control real sobre cuándo se ejecuta el bloque y no puede cancelarse, por lo que puede ejecutarse después de que el self se desasigne si no se retiene.