物业准入,风格还是实质?

时间:2011-06-30 13:46:57

标签: objective-c ios macos

有三种不同的语法样式可用于访问对象的属性:

myProp = value;
self.myProp = value;
[self setMyProp: value];

这些纯粹的风格选择还是实质上存在差异?

4 个答案:

答案 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];

这是什么意思?这意味着前者在为其发出代码之前由编译器转换为后者。这是点符号的唯一含义。只要类声明方法myPropsetMyProp:点符号将起作用。 myProp不需要是正式意义上的属性(即用@property声明)。它也不需要合成。不需要单个实例变量来支持它。只要运行时存在两种方法(如果您从未分配给属性,则为getter),您可以使用点表示法。它与Objective-C属性正交。

所以答案是,是的,对于你的第二个例子,它纯粹是一种风格问题。就个人而言,我讨厌点符号。这是对语言语法的不必要的污染(我的意思是我们现在有两种表达消息发送的方式,其中一种看起来与完全不同的语言特征相同)。 /咆哮

答案 3 :(得分:1)

您的示例#2和#3编译相同,但#1有一个重要区别 - 它不会调用setter。这使得它在setter中很有用(必需),否则你将创建一个无限循环。

例如,此setter创建一个无限循环:

- (void)setMyProp:(int)value
{
self.myProp = value;
}

在吸气器中也是如此。