当我阅读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,这个块不会仍然保留自己。
答案 0 :(得分:1)
self
是强大的,但它超出了块范围,因此块将保留它。 sself
很强,但是在块范围内,它会在块的末尾释放,所以没有圆圈。
顺便说一下,这个question的正确答案是关于块圈的一个很好的解释。