1

到目前为止,我认为 @property 指令生成了一个获取..alloc] init]其各自对象的 getter,现在我不明白为什么这不是语言的一部分。更糟糕的是——访问 nil 属性时也不例外。

我觉得我的推理中有一个误解,但我不知道在哪里。我想知道为什么将自动延迟实例化器作为属性的一部分对于 Cocoa 开发中的几乎所有情况并不理想。

4

2 回答 2

6

属性是 Objective-C 的一个相当新的特性。大量现有代码假定 ivars 初始化为 0,因此对象 getter 以nil. 构建属性的实现是为了实现与大多数人手写(或使用Accessorizer之类的工具)相同类型的访问器。大多数人没有手动创建惰性吸气剂,因此属性也没有以这种方式实现。这是一个特殊的问题,而不是普遍的需求。

(旁注:我在这里的声明有点atomic被默认设置的事实所掩盖,这不是手工编写访问器的最常见方式。但它与编写访问器的常见方式兼容,只是速度较慢,有些人做到了例行编写原子访问器。懒惰是不兼容的。)

在很多情况下,您根本不想要这种行为。我不希望一个-image属性自动生成一个空的UIImage. nil如果没有分配任何东西,我宁愿回来。在许多情况下,“空”和nil. nil标题可能意味着“使用默认值”,而可能@""意味着“为空”。这是一个很常见的模式。我不经常编写惰性访问器(但部分原因是这样做很麻烦。)

有几个类init不是指定的初始化器,甚至可能不是一个合理(甚至合法)的初始化器。

但它可能是一个有用的属性选项,例如:

@property (nonatomic, lazy, readwrite, strong) NSMutableArray *stuff;

如果您发现这通常很有用,您应该在 bugreport.apple.com 上打开一个雷达。

关于nil在 ObjC 中发送消息是合法的事实,这可以追溯到一开始。通常它非常方便(它摆脱了很多错误检查代码)。有时它是非常烦人的错误的根源(有时您仍然需要进行错误检查,而且在什么时候并不总是很明显)。但它不太可能改变。它是语言的基本部分。

于 2013-10-31T03:56:42.277 回答
4

几乎所有标准的读/写属性都是从类外部分配的。在这种情况下不需要惰性实例化。该属性仅保存可能已分配的任何值。如果没有赋值,你会得到nil. 这都是正常使用。因此,普通的合成 getter 返回可以分配的任何值。标准的综合设置器只保留分配的值,负责适当的内存管理和一些 KVO。

如果您希望 getter 返回一些内部的、延迟加载的值,那么这是一种特定于您对该属性的需求的行为。您需要实现自己的自定义 getter 以提供该行为。这远不如大多数简单的属性常见。

于 2013-10-31T03:43:21.287 回答