合成属性和带下划线前缀的变量:这是什么意思?

时间:2011-05-18 18:21:24

标签: objective-c cocoa-touch ios properties

  

可能重复:
  Underscore prefix on property name?

这是什么意思? @synthesize window=_window;我知道,一般来说,这意味着“某个班级”有一个窗口,但为什么要使用_window代替window?这是名称空间吗?

3 个答案:

答案 0 :(得分:25)

我将用基本的英语来描述这个编程约定。

在其他语言中,使用前面的mm__命名成员变量是非常常见的惯例,以区别于本地声明的变量,并表示它们应该必要时编写访问者(无classInstance.m_Variable = 5)。

如果Objective-C程序员声明遵循此约定的ivars(他们应该)并使用基本语法@synthesize _window;,那么该属性的用法会变得有点难看:classInstance._window = myWindow[classInstance set_window:myWindow] 。使用语法@synthesize window=_window;允许Obj-C程序员使用流行的编程标准(在_之前的ivars),同时具有使用Apple标准classInstance.window = myWindow和{{1}的属性访问者}。

答案 1 :(得分:4)

在iOS编程/ objective-C中这是很常见的事情,它与ivars有关。有关详细信息,请参阅此处:

Why rename synthesized properties in iOS with leading underscores?

How does an underscore in front of a variable in a cocoa objective-c class work?

根据我在我的代码中养成这种习惯的经验,当你的意思是self.window时,它会让我意外地编写窗口,反之亦然(不必是窗口,也不是任何其他变量)

答案 2 :(得分:3)

简短回答是:下划线只是一个有用的惯例,强调类变量对类是“私有”的,你应该通过它们的属性访问它们。

你可以在没有前导下划线的情况下声明你的window变量;在这种情况下,@ synthetize语句将简单地:@synthetize window,它实际上是相同的。

对于长篇答案,aherlambang发布的链接非常有趣......