【发布时间】:2014-03-27 06:45:42
【问题描述】:
我在阅读SDWebImage源码的时候,发现了一个sn -p
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);
}
很容易理解,为了避免retain循环,它对self使用了__weak关键字,但是,为什么将wself分配给一个强变量sself,块不会仍然保留self。
【问题讨论】:
-
为什么不直接使用 self 呢?
-
@Danyun
self是一个强但它超出了块范围,因此块将保留它。sself虽然强但是在block范围内,会在block的末尾释放,所以没有圈子。 -
@KudoCC 听起来很合理。如果您发表评论作为答案,我会接受。
标签: ios