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