为什么属性具有用户可设置的存储和生命周期属性,但ivars没有。特别考虑到财产由伊瓦尔支持的事实。
答案 0 :(得分:6)
实例变量可以具有属性,例如__strong
,__weak
,__unsafe_unretained
等。
此外,正如其他人所说,属性是关于行为。它们声明了访问器方法,并且调用访问器方法正在调用行为。该属性还是 interface ,而实例变量是 implementation 。因此,属性将设计合同传达给类的客户。对于实例变量,这不是必需的,因为客户端理想情况下应该不了解实现细节。
答案 1 :(得分:4)
属性并不总是由ivar支持。属性只是实现访问器的承诺。如果您没有自己实现访问器,那么系统将自动为您编写一些(称为“合成”),并将创建一个ivar作为实现细节。您要描述的属性是编译器关于如何编写合成访问器的指令。
在ObjC 2之前,我们手工编写了所有访问器。稍后添加属性和合成访问器以自动实现此时已经建立的模式。
答案 2 :(得分:2)
因为@property
的效果基本上是通过声明实例变量得到的结果的超集。使用@property
,您告诉编译器创建实例变量以及访问器方法。额外的细节告诉它这些访问器应该如何工作。使用实例变量,您只需要声明ivar并将其保留在那里。