有三种不同的语法样式可用于访问对象的属性:
myProp = value;
self.myProp = value;
[self setMyProp: value];
这些纯粹的风格选择还是实质上存在差异?
答案 0 :(得分:4)
self.myProp = value;
和
[self setMyProp: value];
是样式选择,因为它们使用访问器来设置值。也就是说,self.myProp
基本上与调用[self setMyProp]
或[self myProp]
相同。它将实现您在@property
标记中定义的任何机制(保留,根据需要释放等)。
然而,
myProp = value;
实质上是不同的,因为它只是一项任务。不考虑释放myProp
的原始指针,保留新值等等。
答案 1 :(得分:2)
第一个是直接分配到iVar myProp。 第二个和第三个是相同的。 你应该更喜欢第二个或第三个,因为当你使用@synthesize时,setter会为你做内存管理。
答案 2 :(得分:1)
myProp = value;
这是对C变量的直接赋值。它根本不是属性访问。
self.myProp = value;
这是语法糖:
[self setMyProp: value];
这是什么意思?这意味着前者在为其发出代码之前由编译器转换为后者。这是点符号的唯一含义。只要类声明方法myProp
和setMyProp:
点符号将起作用。 myProp
不需要是正式意义上的属性(即用@property
声明)。它也不需要合成。不需要单个实例变量来支持它。只要运行时存在两种方法(如果您从未分配给属性,则为getter),您可以使用点表示法。它与Objective-C属性正交。
所以答案是,是的,对于你的第二个例子,它纯粹是一种风格问题。就个人而言,我讨厌点符号。这是对语言语法的不必要的污染(我的意思是我们现在有两种表达消息发送的方式,其中一种看起来与完全不同的语言特征相同)。 /咆哮
答案 3 :(得分:1)
您的示例#2和#3编译相同,但#1有一个重要区别 - 它不会调用setter。这使得它在setter中很有用(必需),否则你将创建一个无限循环。
例如,此setter创建一个无限循环:
- (void)setMyProp:(int)value
{
self.myProp = value;
}
在吸气器中也是如此。