【问题标题】:Weak/Strong Annotations for Non-Synthesized Properties in Objective-CObjective-C 中非综合属性的弱/强注释
【发布时间】:2014-02-06 21:03:06
【问题描述】:

从 Objective-C 2.0 开始,我们有了 properties,这是一种用于获取和设置实例变量值的好语法。从 Clang 3.1 开始,所有非动态属性、不具有显式 getter 的只读属性或没有自定义 getter 和 setter 的属性都自动合成到 ivars。自从 ARC 以来,我们为属性提供了 weak/strong annotations,ARC 使用这些属性来定义自动合成属性的内存管理逻辑

属性仍然可以手动合成,例如例如,对于由 ivar 支持并返回默认值的只读属性。

有时,如果根本不合成属性,它们也很有用。当我使用这种行为时,我发现了一些用例:

  • 使用自定义 ivar 存储实际值并执行一些附加操作的自定义 getter 和 setter。
  • 动态属性,例如在NSManagedObject 的子类中。
  • 只读属性,它简单地传递存储在另一个属性(例如私有属性)中的对象的属性。

问题:根据实际使用情况用弱/强注释这些非综合属性是否有意义?最佳做法是什么?

(https://twitter.com/kubanekl/status/427142577310408704)

【问题讨论】:

  • 旁注 - 没有显式 getter 方法的只读属性可以自动合成。
  • @rmaddy 感谢您的提示,我在第二句话中解决了这个问题...

标签: ios objective-c memory-management properties automatic-ref-counting


【解决方案1】:

我会说答案是是的,即使只是为了记录。

即使您不使用任何与编译器和框架相关的默认实现,而是自己实现所有内容,尝试使用这些属性的人如果能够获得提示,也将能够更好地理解 API内存管理的行为方式。一个人实际上不必知道 setter 或 getter 是如何在内部实现的,但他可能必须知道,例如,在调用 setter 之后,值是否被复制或保留或只是分配,并实现他的一面相应的事情。

【讨论】:

    【解决方案2】:

    是的,确实如此。

    属性定义是合同规范。仅仅因为编译器没有履行合同并不意味着您在手动实现访问器方法时不应该尊重它。

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 1970-01-01
      • 2012-09-23
      • 2012-04-09
      • 2011-12-16
      • 1970-01-01
      • 2012-03-18
      • 2012-06-16
      相关资源
      最近更新 更多