Explique los motivos de uso __weak y __strong en el código SDWebImage

Creo que entiendo bien las palabras clave fuertes y débiles, pero no entiendo cómo se usan en el código a continuación. Este código es de SDWebImage por Olivier Poitrey disponible en github. Entiendo las palabras clave fuertes y débiles como se describe aquí:Explicación de almacenamiento fuerte y débil en iOS5

El siguiente código utiliza palabras clave __weak y __strong de una manera que me resulta curiosa. No es una relación hijo-padre o patrón de delegado, ya que estoy acostumbrado a ver que se usa débilmente. Sin embargo, estoy seguro de que este es un patrón que se usa a menudo, como lo he visto antes en otro código. Establece una referencia __ débil antes de un bloque que se ejecuta en otro hilo. Luego, dentro del bloque, establece la referencia débil a una referencia fuerte.

Estoy seguro de que este código bueno y elegante, por lo que estoy tratando de entenderlo. Si "self" deja de existir antes de que se ejecute el bloque, la auto-referencia débil se pondrá a cero. Cuando se ejecuta el bloque, la referencia fuerte también se establecerá en cero. Por lo tanto, sabrá matar el resto de la operación ya que el yo ya no existe. ¿Conseguí esto bien?

Ahora, ¿qué pasaría si no usáramos las palabras clave __weak y __strong? ¿Qué pasa si acabamos de comprobar dentro del bloque si auto == nil. ¿El "yo" nunca sería nulo ya que el bloque copia todo el árbol?

¿Puede alguien ayudar a desmitificar esta increíble pieza de código? ¿Puede alguien verificar o repudiar mis hipótesis?

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock;
{
    [self cancelCurrentImageLoad];

    self.image = placeholder;

    if (url)
    {
        __weak UIImageView *wself = self;
        id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
        {
            __strong UIImageView *sself = wself;
            if (!sself) return;
            if (image)
            {
                sself.image = image;
                [sself setNeedsLayout];
            }
            if (completedBlock && finished)
            {
                completedBlock(image, error, cacheType);
            }
        }];
        objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta