Fuerte reference a references débiles dentro de bloques

¿Por qué es necesario tener una fuerte reference a una reference débil dentro de un bloque?

Entiendo que tener una reference débil dentro del bloque evitará los ciclos de retención. ¿Pero por qué hay una fuerte reference al débil otra vez?

Fondo:
Según lo descrito por Mason, esta es la mejor práctica.

Sé que la forma correcta de referirse a uno mismo dentro de un bloque es crear una reference débil fuera del bloque, y luego una fuerte reference a esa reference débil dentro del bloque […]

Ejemplo:

__weak typeof(self) weakSelf = self; void (^someBlock)(id) = ^(id data){ typeof(self) strongSelf = weakSelf; // code using strongSelf }); 

Imagine que la última reference sólida restante a uno mismo se lleva a cabo en un hilo diferente al que su bloque ejecuta.

Ahora esto sucede:

 __weak typeof(self) weakSelf = self; void (^someBlock)(id) = ^(id data){ if (weakSelf != nil) { // last remaining strong reference released by another thread. // weakSelf is now set to nil. [myArray addObject:weakSelf]; } }); 

Esto se bloqueará con una exception NSInvalidArgument para agregar nil a una matriz.

Haciendo que la reference sea fuerte antes del uso elimina la condición de carrera potencial y asegura que el puntero siempre señale el mismo object.

Si está 100% seguro de que un object solo será referencedo por un hilo, no es estrictamente necesario hacerlo. Pero es una mala práctica hacer esa suposition.

No es intrínsecamente necesario, pero la idea general es asegurarse de que el object señalado por weakSelf no se descomponga mientras se ejecuta el bloque. Crear la reference fuerte tiene el efecto secundario de retener el object. Retener será lanzado por ARC cuando la reference fuerte quede fuera de scope. Es en gran medida a la defensiva. En términos generales, debe tratar de proporcionar otras (mejores) garantías de que su sistema se mantenga estable durante la ejecución del bloque.