我遇到了这段代码,并使用它成功地将按钮上的图像着色,直到它在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/

    10-14 21:33
    查看更多