关于objective c:带有下划线前缀的Synthesized属性和变量:这是什么意思?

Synthesized property and variable with underscore prefix: what does this mean?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Underscore prefix on property name?

这是什么意思?@synthesize window=_window;我知道,一般来说,它意味着‘某个类’有一个窗口,但为什么用_window而不是window呢?这是命名空间吗?


我将尝试用基础英语描述这个编程约定。

在其他语言中,用前面的mm__来命名成员变量是一种很常见的惯例,它将成员变量与本地声明的变量区分开来,并表示如果需要,成员变量应编写附件(没有classInstance.m_Variable = 5)。

如果一个Objective-C程序员按照这个约定声明了IVAR(并且应该这样做),并且使用了基本语法@synthesize _window;,那么该属性的用法就变得有些难看了:classInstance._window = myWindow[classInstance set_window:myWindow]。使用语法@synthesize window=_window;允许obj-c程序员使用流行的编程标准(在使用_的ivars之前),同时拥有使用苹果标准classInstance.window = myWindow[classInstance setWindow:myWindow]的属性访问器。


这是在IOS编程/Objective-C中非常常见的事情,它与IVARS有关。有关更多信息,请阅读以下内容:

为什么用前导下划线重命名iOS中的合成属性?

cocoa objective-c类中变量前面的下划线是如何工作的?

根据我在代码中有这个习惯的经验,当您指self.window时,它可以帮助我意外地编写window,反之亦然(不必是window,也可以是任何其他变量)。


简短的回答是:下划线只是一种惯例,它有助于强调类变量对类是"私有"的,您应该通过它们的属性访问它们。

您可以声明您的window变量而不使用前导下划线;在这种情况下,@synthetize语句将简单地为:@synthetize window,并且实际上是相同的。

长话短说来,阿赫勒芒发布的链接真的很有趣。