【问题标题】:With ARC, is @property necessary使用 ARC,是否需要 @property
【发布时间】:2012-03-09 02:06:11
【问题描述】:

使用 ARC,默认情况下每个指针分配都会保留。鉴于此,在非原子情况下,为什么我什至需要声明属性?

这两个有什么不同?

//Property
@interface I1 : NSObject 
@property (nonatomic, strong) NSString* str;
@end

I1 *obj1 = ...;
obj1.str = [[NSString alloc] init...];

//Only member variable
@interface I2 : NSObject { 
@public
    NSString* str;
}
@end
I2 *obj2 = ...;
obj2->str = [[NSString alloc] init...];

【问题讨论】:

标签: ios automatic-ref-counting


【解决方案1】:

内存管理并不是使用属性的唯一优势。

我特别想到的两个是:

  1. KVO(无需手动调用 willChangeValueForKey:didChangeValueForKey: - 请参阅 Manual Change Notification
  2. 能够为 setter 和 getter 编写自定义逻辑以及为 setter 和 getter 编写子类自定义。

bbum 在iOS: must every iVar really be property? 中写了一个很好的回应

【讨论】:

  • 是的,这些好处肯定会支持对房产的需求。
【解决方案2】:

属性是Objective Orientation Programming 的一部分。这是封装!怎么不能用?!始终使用属性来封装您的数据。

【讨论】:

  • 如果在 @implementation 中声明了 ivar,则存在封装,因此在这种情况下还有讨论的余地。
  • 在上述非原子情况下,属性几乎不做任何封装。在 ARC 之前,当然,保留/释放财产是有价值的。
【解决方案3】:

@property/@synthesize 对自动生成 getter 和 setter,从而提供封装。

当然,通常现在可能不需要这种封装,但也许将来您会决定向 iVar 添加一些延迟初始化,或者希望在 iVar 的内容发生变化时发布通知。始终使用属性和合成或手写的访问器是一个好习惯,而且成本可以忽略不计。你为什么使用它们?

(如果您担心@property/@synthesize 模板过多,并且您有 Mac 开发帐户,请查看 Beta 版论坛。)

【讨论】:

  • 我认为这里关于未来可能从财产中受益的论点是有效的。但是,我的问题纯粹是植根于当下。至于我为什么不使用财产的问题是一个错误的问题。任何行动都必须有理由支持。仅仅因为一项行动没有正面或负面影响,并不意味着人们就应该盲目地去做。
  • @RajV 好的代码的一个方面是可维护性,所以如果你想纯粹讨论现在,问题就变成了学术问题。 在实践中,访问器是更好的选择,因为它们可以带来更好的可维护性,而目前不花费任何成本。出于这个原因,人们应该养成使用它们的习惯,恕我直言(除了私有 iVar 和真正且明显对性能至关重要的东西可能例外)。
  • @fzwo 如果 ivar 在 @implementation 中声明,因此在单个文件中是本地的,则可能是通过属性(self.ivar vs ivar)访问 ivar。在这种情况下,稍后更改为属性对于一个文件和类是本地的。请注意,我不是在争论一种或另一种方式。
【解决方案4】:

我认为属性仍然用于自动生成不使用@public 的访问器和修改器。

【讨论】:

  • 在此处介绍的非原子情况下,生成的访问器/修改器必须如此微不足道,以至于没有必要。这是核心问题。我们还需要财产吗?
  • 有KVO要考虑。
【解决方案5】:

在界面中使用@property,因为那是在宣传公共访问。如果您不想将其公开,请将 @property 声明放在类扩展中,或者将 ivar 声明放在 .m 文件中的 @implementation 中。

【讨论】:

    【解决方案6】:

    在 Objective-c 中,@property 只是类中变量的标准 setter 和/或 getter 的缩写。因此,无论您的 ARC 选项是打开还是关闭,您都可以在方便时做出选择。

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2010-12-19
      • 1970-01-01
      • 2012-04-19
      • 2013-02-08
      • 2013-03-17
      • 2012-10-10
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多