在 ARC 下,属性而不是实例变量支持的唯一模式是copy
- 所以如果您需要copy
使用属性。
如果您在该@implementation
部分中声明私有实例变量:
@implementation MyClass
{
// private instance vars
}
那么从课外访问它们需要付出很大的努力。正如您所说,访问“私有”属性只需猜测其名称 - 或使用告诉您的库调用。
为了安全值得吗?YMMV。但无论如何,它都是一个很好的编码实践。
附录
正如评论线索显示的那样,关于我认真努力的使用已经有很多讨论。
首先让我们明确一点:Objective-C 属于 C 语言家族,它们都允许程序员在保持语言的同时进行他们选择的任何事情[ *] - 如果你想要强类型,这些不是选择的语言,访问您的代码中的限制等。
第二,“努力”不是绝对的衡量标准!所以也许我应该选择“明显”这个词来限定它而不是“严重”。要访问私有属性只需要使用对象具有类型的标准方法调用id
- 代码中几乎没有线索表明被调用的方法是隐藏的。要访问私有变量需要 API 调用(运行时函数或 KVC 调用)或一些指针操作 - 生成的代码看起来与标准变量赋值完全不同。所以它更明显。
也就是说,除了使用 requires 之外copy
,在 ARC 下,当私有实例变量可以使用时,没有充分的理由使用私有属性。对于私有变量fred
比较:
self.fred = 42; // property access, may involve a call (if not optimised out)
_fred = 42; // common way to bypass the accessors and get at the underlying var
fred = 42; // direct access
选择吧,没有正确的答案,但也没有错误的答案- 这是意见的领域(这当然是意见;-))。我经常会选择最后一个,私有变量——干净且简单。但是@RobNapier 在他的回答中更喜欢使用属性。
[*] 注意:一旦你考虑链接到外部代码,比如用汇编程序编写的,所有的赌注都可以使用任何语言。此时,您必须查看“硬件”(真实或虚拟)和/或“操作系统”以提供保护。