为什么属性默认情况下懒惰地实例化?

use*_*ser 1 properties objective-c

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

我觉得在我的推理中某处存在误解,但我不知道在哪里.我想知道为什么将自动惰性实例化器作为属性的一部分对于Cocoa开发中的几乎所有情况都不是理想的.

Rob*_*ier 6

属性是Objective-C的一个相当新的特性.大量现有代码假定ivars初始化为0,因此对象getter起始为nil.构建属性的实现是为了实现大多数人手工编写的相同类型的访问器(或者使用像Accessorizer这样的工具).大多数人并没有手工创建懒惰的吸气剂,所以属性也没有以这种方式实现.这是一个专门的问题,而不是常见的需求.

(旁注:我的声明在某种程度上暗示atomic了默认情况,这不是最常用的手工编写访问器的方法.但它与编写访问器的常用方法兼容,只是速度慢,有些人做了经常写原子访问器.懒惰不兼容.)

在许多情况下,您根本不需要此行为.我不希望-image属性自动生成空UIImage.nil如果没有分配,我宁愿回去.在许多情况下,"空"和"空"之间存在显着差异nil.一个nil标题可能意味着"使用默认",而@""可能意味着"是空的." 这是一种非常常见的模式.我不经常写懒惰访问器(但部分是因为这样做很麻烦.)

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

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

@property (nonatomic, lazy, readwrite, strong) NSMutableArray *stuff;
Run Code Online (Sandbox Code Playgroud)

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

关于nil在ObjC中传达信息是合法的事实,这可以追溯到最开始.通常它非常方便(它摆脱了很多错误检查代码).有时它是非常烦人的错误的来源(有时你仍然需要进行错误检查,并且它并不总是很明显).但它不太可能改变.这是该语言的基本部分.