【问题标题】:When assign a weak variable to a strong variable将弱变量分配给强变量时
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2014-08-20
    • 2014-04-23
    • 2014-06-04
    相关资源
    最近更新 更多