我遇到了这段代码,并使用它成功地将按钮上的图像着色,直到它在iOS 9发行版中开始失败:
UIImage * __weak image = [[self imageForState:UIControlStateNormal]
imageWithRenderingMode:renderingMode];
[self setImage:image forState:UIControlStateNormal];
当我第一次看到
__weak
在这种情况下使用时,我就耸了耸肩,但后来也看到它在类似情况下在其他地方使用过,因此认为它是对的,但并未真正理解它的用途。删除它修复了iOS 9发行版构建错误,该图像根本没有出现在按钮上(我想这是由于更积极的内存优化导致立即取消分配了图像),但我想知道:
首先是否需要
__week
,如果需要,为什么,并且将其删除会导致UIImage泄漏?编辑:这是一个简单的类,可以执行相同的操作并表现出相同的行为,以防有人需要“上下文”示例:https://github.com/tdginternet/TGCameraViewController/blob/master/TGCameraViewController/Classes/UI/TGTintedButton.m
最佳答案
如果引用的对象可能未被另一方强烈引用,则不要在局部变量上设置__weak
。
在您发布的代码中,由于对象(图像)是动态创建的,所有权被传递给调用者,因此调用者至少在调用者的生命周期内有责任对其进行强烈引用。如果系统看不到对该对象的强引用,则可以随时对其进行取消分配。在发行版本中,在setImage调用之前,将对象释放,并且将弱引用更新为nil
。
在这里,我们应该使用对图像的典型强引用,并且由于局部变量在方法调用后将消失,因此强引用将被释放。
要回答您的问题:
__weak
,实际上在这里是错误的image
强烈引用维基百科上有一篇很好的有关Automatic Reference Counting的文章,它解释了ARC和弱引用是如何工作的。
希望这可以帮助!
关于ios - 是否需要__weak?在这种情况下有什么用?会泄漏吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33272917/