需要__weak吗?在这种情况下它的用途是什么?它会泄漏吗?

时间:2015-10-22 03:28:40

标签: ios objective-c memory-leaks uibutton

我遇到过这段代码并用它在一个按钮上成功着色,直到它在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

1 个答案:

答案 0 :(得分:1)

如果它引用的对象可能没有被另一方强烈引用,请不要在局部变量上设置__weak

在您发布的代码中,由于对象(图像)是即时创建的,并且所有权传递给调用者,调用者负责保存对它的强引用,至少在调用者的生命周期内。如果系统没有看到对该对象的强引用,并且可能随时解除分配。在发布版本中,对象被取消分配,弱引用在setImage调用之前更新为nil。 这里我们应该使用典型的图像强引用,并且在方法调用之后局部变量将消失,强引用将被释放。

回答你的问题:

  1. __weak不是必需的,而且实际上是错误的
  2. 作者希望避免强烈引用image
  3. 没有它不会泄漏
  4. 维基百科有一篇关于Automatic Reference Counting的好文章,它解释了ARC和弱引用的工作原理。

    希望这有帮助!