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

可能重复:
属性名称的下划线前缀?

这是什么意思? @synthesize window=_window; 我知道一般来说这意味着“某个类”有一个窗口,但为什么使用_window而不是window ? 这是一个命名空间的东西?

我会用基本的英文来描述这个编程习惯。

在其他语言中,使用前面的mm__来指定成员variables是一个非常普遍的约定,以区分它们与本地声明的variables,并且表示必要时(如果需要,应该有访问器写入)(无classInstance.m_Variable = 5 )。

如果一个Objective-C程序员声明ivars遵循这个约定(他们应该)并且使用基本的语法@synthesize _window; 那么该属性的用法变得有些丑陋: classInstance._window = myWindow[classInstance set_window:myWindow] 。 使用语法@synthesize window=_window; 允许Obj-C程序员在使用Apple标准classInstance.window = myWindow[classInstance setWindow:myWindow]属性访问器的同时,使用stream行的编程标准(在_之前的ivars)。

在iOS编程/ objective-C中这是一件非常常见的事情,它与ivars有关。 欲了解更多信息,你可以阅读这里:

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

如何在cocoaObjective-C类中的variables前面的下划线工作?

根据我的经验,在我的代码中有这样的习惯,它可以帮助我意外地写窗口,当你指的是self.window,反之亦然(不必是窗口,但也有其他variables)

简单的答案是:下划线只是一个有用的强调事实,即类variables对于一个类是“私人的”,你应该通过它们的属性访问它们。

你可以声明你的windowvariables没有前导下划线; 在这种情况下,@synthetize语句将会是简单的: @synthetize window ,它实际上是一样的。

对于长的答案,由aherlambang张贴的链接是真正有趣的阅读…