Объясните причины слабого и слабого использования в коде SDWebImage

Я думаю, что хорошо понимаю сильные и слабые ключевые слова, но я нене понимаю, как этоИспользуется в коде ниже. Этот код взят из SDWebImage Оливье Пойтри и доступен на github. Я понимаю сильные и слабые ключевые слова, как описано здесь:Объяснение сильного и слабого хранилища в iOS5

Приведенный ниже код использует ключевые слова __weak и __strong, что мне интересно. Это не отношения «ребенок-родитель» или шаблон делегата, поскольку я привык видеть слабое использование. Однако я'Я уверен, что это шаблон, который часто используется, так как яЯ видел это раньше в другом коде. Он устанавливает слабую ссылку перед блоком, который выполняется в другом потоке. Затем внутри блока он устанавливает слабую ссылку в сильную ссылку.

Я уверен, что это хороший и элегантный код, поэтому яЯ пытаюсь понять это. Если "Я» перестает существовать до запуска блока, слабая собственная ссылка обнуляется. Когда блок запускается, сильная ссылка также будет установлена на ноль. Следовательно, он будет знать, как убить оставшуюся часть операции, так как self небольше не существует. Я правильно понял?

Теперь, что случилось бы, если бы мы неt использовать слабые и сильные ключевые слова? Что если мы просто проверили внутри блока, является ли self == nil. Было бы "Я» никогда не будет ноль, так как блок копирует все дерево?

Может ли кто-нибудь помочь демистифицировать этот удивительный кусок кода? Может ли кто-нибудь проверить или отвергнуть мои гипотезы?

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

Ответы на вопрос(2)

Ваш ответ на вопрос