Ed *_*hin 5 iphone ios objective-c-blocks automatic-ref-counting sdwebimage
我认为我很了解强弱关键词,但我不明白它是如何在下面的代码中使用的.此代码来自github上的Olivier Poitrey的SDWebImage.我理解这里描述的强弱关键词:iOS5中强弱存储的解释
下面的代码以对我很好奇的方式使用__weak和__strong关键字.它不是一个孩子 - 父母的关系或委托模式,因为我习惯于看到弱的使用.但是,我确信这是一个经常使用的模式,正如我之前在其他代码中看到的那样.它在另一个线程上运行的块之前设置__weak引用.然后,在块内,它将弱引用设置为强引用.
我确信这个优雅而优雅的代码,所以我试图理解它.如果在块运行之前"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);
}
}
Run Code Online (Sandbox Code Playgroud)
该downloadWithUrl:方法可能需要很长时间.在那个时候,用户可能决定离开,消除了SDWebImage对象的需要.为了便于早期清理对象,外部self参考很弱.这样,downloadWithUrl不会阻止SDWebImage被解除分配.
当然,如果你真的想要合作self,你需要一个强有力的参考.因此,完成后的块downloadWithUrl可以获得强有力的参考self.如果物体在这个时间消失,那sself将是nil.否则,它将是一个有效的强引用,表示该SDWebImage对象仍然存在,并且该对象此时将完成其工作.