将弱变量赋值给强变量时

时间:2014-03-27 06:45:43

标签: ios

当我阅读SDWebImage源代码时,我找到了一个片段

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

很容易理解,为了避免保留周期,它为自己使用__weak关键字,但是,为什么它将自己分配给一个强变量sself,这个块不会仍然保留自己。

1 个答案:

答案 0 :(得分:1)

self是强大的,但它超出了块范围,因此块将保留它。 sself很强,但是在块范围内,它会在块的末尾释放,所以没有圆圈。

顺便说一下,这个question的正确答案是关于块圈的一个很好的解释。