带有下划线前缀的合成属性和variables:这是什么意思?
可能重复:
属性名称的下划线前缀?
这是什么意思? @synthesize window=_window;
我知道一般来说这意味着“某个类”有一个窗口,但为什么使用_window
而不是window
? 这是一个命名空间的东西?
我会用基本的英文来描述这个编程习惯。
在其他语言中使用前面的m
, m_
或_
来指定成员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对于一个类是“私人的”,你应该通过它们的属性访问它们。
你可以声明你的window
variables没有前导下划线; 在这种情况下,@synthetize语句就是简单的: @synthetize window
,实际上是一样的。
对于长的答案,由aherlambang张贴的链接是真正有趣的阅读…