我认为我很好地理解了强引用和弱引用关键字,但是我不理解下面的代码如何使用。这段代码来自Olivier Poitrey在github上提供的SDWebImage。我理解强引用和弱引用的方式如此描述:iOS5中强引用和弱引用存储的解释。
下面的代码以一种让我感到好奇的方式使用__weak和__strong关键字。它不是我习惯看到的子父关系或委托模式中使用的弱引用。然而,我确定这是一个经常使用的模式,因为我在其他代码中也看到过它。它在另一个线程上运行的块之前设置了一个__weak引用。然后,在块内部,将弱引用设置为强引用。
我确信这是优秀且优雅的代码,所以我正在努力理解它。如果“self”在块运行之前停止存在,则弱self引用将归零。当块运行时,强引用也将被设置为零。因此,它将知道杀死其余的操作,因为self不再存在。我的理解正确吗?
现在,如果我们不使用__weak和__strong关键字会发生什么?如果我们只是在块内部检查self == nil会发生什么?由于块复制整个树,因此“self”永远不会为nil吗?
能否有人帮助揭开这段神奇的代码的秘密?能否有人验证或驳斥我的假设?
下面的代码以一种让我感到好奇的方式使用__weak和__strong关键字。它不是我习惯看到的子父关系或委托模式中使用的弱引用。然而,我确定这是一个经常使用的模式,因为我在其他代码中也看到过它。它在另一个线程上运行的块之前设置了一个__weak引用。然后,在块内部,将弱引用设置为强引用。
我确信这是优秀且优雅的代码,所以我正在努力理解它。如果“self”在块运行之前停止存在,则弱self引用将归零。当块运行时,强引用也将被设置为零。因此,它将知道杀死其余的操作,因为self不再存在。我的理解正确吗?
现在,如果我们不使用__weak和__strong关键字会发生什么?如果我们只是在块内部检查self == nil会发生什么?由于块复制整个树,因此“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<SDWebImageOperation> 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);
}
}
self
通过关联引用保留了operation
。operation
保留了该块。如果该块保留了self
,那么就会形成一个循环。 - newacct