当你可以调用“类变量”时,为什么要调用“self.class Variable”?

时间:2011-01-24 21:20:03

标签: objective-c

据我所知,一个版本直接访问实例变量,另一个版本调用它的访问器方法。

If self.classVariable = sandwich; 

&安培;

If classVariable = sandwich; 

做同样的事情。

有人可以解释一下额外打字的意义吗?

3 个答案:

答案 0 :(得分:2)

在Objective-C中,self.property property 访问权限,而非直接实例变量访问权限。它是[self property][self setProperty:]的合成糖,因此具有消息的语义。现代Objective-C运行时可以合成一个后备实例变量(与该属性同名),但是您可以使用具有不同名称或根本不具有实例变量的属性来备份该属性。换句话说,

self.property = foo;
id bar = property

property = foo;
id bar = property;

根本不是一回事。

混合直接访问和属性访问通常是一个坏主意(除了您应该直接在-init-dealloc方法中访问ivars),因为您很容易违反内存管理规则。

答案 1 :(得分:0)

额外的输入是为了保护代码免受将来的更改,以防变量被命名(在范围内)等于类成员。

在引用班级成员时,包括自我在内的成员明确地清楚它在哪些方面有助于加快对代码的理解,这也被认为是一种良好的做法(在某些圈子里)。

具体来说,对于Objective-C,还有另一个区别,如http://answers.oreilly.com/topic/1193-calling-self-object-rather-than-calling-the-object-directly-in-objective-c/

所述

SELF.X表示法通过@synthesize指令生成的访问器,而X直接绕过它们。

答案 2 :(得分:0)

如果您浏览了访问者,可以在那里设置断点。有时很方便。如果您不通过访问者,保留/复制属性也不会起作用。