自变量和变量差异

时间:2009-02-11 11:27:42

标签: objective-c cocoa-touch cocoa declared-property

当我使用self.myVariable = obj; / myVariable = obj;创建`myVariable时,@propery@synthesize之间有什么区别?

6 个答案:

答案 0 :(得分:14)

重要的是要注意点编译器将点语法转换为简单的objc_msgSend调用:也就是说,它下面的行为就像发送给该变量的访问者的消息一样。因此,以下所有三个都是等价的:

self.myVariable = obj;

[self setMyVariable:obj];

objc_msgSend(self, @selector(setMyVariable:), obj);

当然,这意味着使用点语法实际上会导致完整的消息发送,这意味着调用一个新函数以及与之相关的所有开销。相反,使用简单赋值(myVariable = obj;)不会产生这种开销,但当然它只能在相关类的实例方法中使用。

答案 1 :(得分:13)

@synthesize指令告诉编译器根据.h文件中@property指令中给出的规范为成员变量生成访问器。 (即,如果指定retain,则setter将保留变量,如果指定copy,则会复制它。)

访问者将(除非您另行指定)将命名为propertyName和setPropertyName。

使用。符号(注意,不是上面提到的自语法)是说你想要使用访问器(如果你设置字符串是一件好事,并且想要确保保留计数是正确的)。

所以,在你的类实现中:

  • self.bill = fred会打电话给 accessor setBill。
  • bill = fred将把账单设置为fred 直接,不经过 存取器。

答案 2 :(得分:5)

我在启动Cocoa开发时发现的一个差异是,如果我将变量设置为使用@ Property / @ Synthesize语法并且我没有使用 self.myVariable = obj [self setMyVariable:obj] 但是 myVariable = obj ,如果稍后发布 obj ,则不会保留该对象。 (假设@Property设置为使用retain。)

原因是当使用 myVariable = obj 时未设置保留计数,并且当释放obj时,计数现在为零。 (除非你自己保留)但是通过使用访问器,它将为你做保留计数。 (再次假设您将其设置为在声明时使用retain)。

答案 3 :(得分:4)

SHYNE

如果我可以为此添加一个重要说明。上面的答案都很棒,所以我不会添加到技术方面。但就是这样:

如果您创建合成属性

@synthesize myProp;

始终使用 self.myProp 模式进行设置。

self.myProp = newVal;

这看起来非常明显,但这很重要。确实没有理由这样做,但在你真正理解合成的setter如何创建之前,你只想假设你必须使用self。模式来设置值。

诚实:这将为您节省大量的深夜调试会话。非保留内存访问违规只是调试最差的。

答案 4 :(得分:2)

self语法使用访问器方法,而其他语法则不使用。如果访问者做的不仅仅是分配新值,那么这可能是一个很大的不同。请参阅Objective-C教程的Declared Properties部分。

答案 5 :(得分:2)

其他答案是正确的,区别在于点符号会导致ivar通过附件而不是直接更改。

在您知道自己在做什么之前,我建议您使用点符号(即self.propertyName = ...)。 Cocoa / Obj-C在键值编码方面做了很多工作,虽然手机SDK没有充分利用它(包括绑定之类的东西),但最终它会。现在习惯使用访问器将在未来为您节省很多麻烦。

使用访问器方法还可以根据需要覆盖它们并提供更多功能。通过简单地改变ivar的值,你可以剥夺自己的这种能力。