【发布时间】:2011-08-28 07:14:40
【问题描述】:
这是什么意思? @synthesize window=_window; 我知道一般来说这意味着“某个类”有一个窗口,但为什么要使用_window 而不仅仅是window?这是命名空间的事情吗?
【问题讨论】:
标签: objective-c cocoa-touch ios properties
这是什么意思? @synthesize window=_window; 我知道一般来说这意味着“某个类”有一个窗口,但为什么要使用_window 而不仅仅是window?这是命名空间的事情吗?
【问题讨论】:
标签: objective-c cocoa-touch ios properties
我将尝试用基本的英语来描述这个编程约定。
在其他语言中,使用前面的m、m_ 或_ 来命名成员变量是一种非常常见的约定,以将它们与本地声明的变量区分开来,并表示它们应该在必要时编写访问器(没有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 和 [classInstance setWindow:myWindow] 的属性访问器。
【讨论】:
简短的回答是:下划线只是一个约定,用于强调类变量是类“私有”的事实,您应该通过它们的属性访问它们。
你可以声明你的window 变量而不带前导下划线;在这种情况下,@synthetize 语句很简单:@synthetize window,实际上是一样的。
对于长答案,aherlambang 发布的链接真的很有趣...
【讨论】:
这是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 时,它可以帮助我意外编写 window ,反之亦然(不一定是 window,也可以是任何其他变量)
【讨论】: