【发布时间】:2014-11-26 23:18:42
【问题描述】:
我认为我对强关键字和弱关键字理解得很好,但我不明白它在下面的代码中是如何使用的。此代码来自 Olivier Poitrey 的 SDWebImage,可在 github 上找到。我理解强关键字和弱关键字,如下所述:Explanation of strong and weak storage in iOS5
下面的代码使用了 __weak 和 __strong 关键字,这让我很奇怪。它不是我习惯于看到弱使用的子父关系或委托模式。但是,我确信这是一种经常使用的模式,正如我之前在其他代码中看到的那样。它在另一个线程上运行的块之前设置一个 __weak 引用。然后,在块内,它将弱引用设置为强引用。
我确信这段代码很好,很优雅,所以我试图理解它。如果“self”在块运行之前不再存在,弱自引用将归零。当块运行时,强引用也将设置为零。因此,它会知道杀死其余的操作,因为 self 不再存在。我做对了吗?
现在,如果我们不使用 __weak 和 __strong 关键字会发生什么?如果我们只是在块内部检查 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);
}
}
【问题讨论】:
标签: iphone ios automatic-ref-counting objective-c-blocks sdwebimage