Explicar razões de uso __weak e __strong no código SDWebImage

Acho que entendo bem as palavras-chave fortes e fracas, mas não entendo como é usado no código abaixo. Este código é da SDWebImage de Olivier Poitrey disponível no github. Eu entendo palavras-chave fortes e fracas como é descrito aqui:Explicação do armazenamento forte e fraco no iOS5

O código abaixo usa palavras-chave __weak e __strong de uma forma que é curiosa para mim. Não é um relacionamento pai-filho ou padrão delegado, como estou acostumado a ver usado fraco. No entanto, tenho certeza de que esse é um padrão que é usado com frequência, como eu já vi antes em outro código. Ele define uma referência __weak antes de um bloco que é executado em outro segmento. Então, dentro do bloco, define a referência fraca para uma referência forte.

Estou certo de que este código bom e elegante, por isso estou tentando entender isso. Se "self" deixar de existir antes de o bloco ser executado, a autoentrada fraca será zerada. Quando o bloco é executado, a referência forte também será definida como zero. Portanto, saberá matar o resto da operação, já que o eu não existe mais. Eu fiz isso certo?

Agora, o que aconteceria se não usássemos palavras-chave __weak e __strong? E se acabássemos de verificar dentro do bloco se auto == nil. O "eu" nunca seria nulo, já que o bloco copia a árvore inteira?

Alguém pode ajudar a desmistificar esse pedaço incrível de código? Alguém pode verificar ou repudiar minhas hipóteses?

- (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);
    }
}

questionAnswers(2)

yourAnswerToTheQuestion