gpt4 book ai didi

ios - __weak 是必需的吗?在这种情况下它有什么用?会不会漏?

转载 作者:行者123 更新时间:2023-11-29 12:11:45 27 4
gpt4 key购买 nike

我遇到过这段代码并使用它成功地为按钮上的图像着色,直到它在 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。这里我们应该使用典型的图片强引用,由于方法调用后局部变量会消失,所以强引用会被释放。

回答你的问题:

  1. __weak 不是必需的,这里实际上是错误的
  2. 作者希望避免持有对image的强引用
  3. 不会漏的

维基百科上有一篇关于 Automatic Reference Counting 的好文章这解释了 ARC 和弱引用的工作原理。

希望这对您有所帮助!

关于ios - __weak 是必需的吗?在这种情况下它有什么用?会不会漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33272917/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com