【问题标题】:ARC and Interface BuilderARC 和界面生成器
【发布时间】:2012-04-04 09:23:37
【问题描述】:

我有一个关于界面生成器和 ARC 的有趣问题。我正在构建一个将使用 xib 初始化的视图控制器。我使用界面生成器的点击和拖动功能为我的 xib 创建必要的属性插座。这会将属性初始化为(弱,非原子)。听起来不错。

让我失望的是 [self setCategoryButton:nil]; 这样的行会自动添加到 viewDidUnload 中。我在 ARC 之前了解并使用过这个。但是,由于这些是弱引用,当视图卸载时它们不会自动清除吗?

我想如果这些视图被其他对象保留,我想我可以看到这些属性的价值,但这对我来说似乎是一个不寻常的情况......只是想获得关于这一点的进一步反馈。

谢谢,

库尔特

【问题讨论】:

    标签: iphone objective-c interface-builder automatic-ref-counting


    【解决方案1】:

    我不久前对此提出了一个错误,我得到的回应是这是故意的行为。由于 Xcode 无法验证没有其他对视图的强引用,它实际上不能保证弱指针会在-viewDidUnload 中自动清除。因此,他们会为您清除它。

    就个人而言,我认为这是一个蹩脚的理由,但这就是给出的理由。

    【讨论】:

      【解决方案2】:

      来自文档,viewDidUnload

      • “此方法...是您执行任何最终清理的机会。...”
      • “当内存不足且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图”

      来自文档,关于弱(Setter Semantics)

      • 指定与目标对象存在弱(非拥有)关系。 如果目标对象被释放,属性值会自动设置为 nil

      所以很明显。符合规则。不是关于你的属性指向的对象,而是根据上面的弱规则将你的属性无效。

      viewDidUnload 假设你的弱属性不能指向任何对象, 因为该对象已被释放(基于 viewDidUnload 在 View Controller 的生命周期中的位置)。并简单地用 nil 清理它。

      这对你来说是安全的,明确的弱规则和内存效率。 编译器无法确定您是否关注了指向的对象。 他只需要确保清理干净。

      【讨论】:

        【解决方案3】:

        它只会在 iOS5 或更高版本中设置为 nil(iOS 4 不会自动为 nil 弱指针),因此它在自动生成的代码中是为了安全起见。我自己一直在想这个,这是我能想出的唯一原因。

        【讨论】:

        • 如果您的部署目标包括 iOS 4,那么无论如何您将无法使用弱指针;他们将是unsafe_unretained
        • 好点。很好地实际提交了一个错误,而不是像我一样让它模糊地打扰你。
        【解决方案4】:

        由于属性为weak,因此对象中的引用不会影响对象的保留计数。所以是的,将对象设置为零是没有意义的。至少我是这么理解的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-09
          • 1970-01-01
          • 2014-05-20
          • 2011-03-26
          • 1970-01-01
          相关资源
          最近更新 更多