什么时候在实例变量前面加下划线?

Tha*_*nks 30 iphone cocoa cocoa-touch objective-c

可能重复:
cocoa objective-c类中变量前面的下划线如何工作?

我在Apple,UIPickerView.h中看过这个:

id<UIPickerViewDataSource> _dataSource;
Run Code Online (Sandbox Code Playgroud)

那为什么强调那里?它有特殊意义吗?我必须知道的一项公约?

Ree*_*sey 34

很多人将此用于私有变量,以区分对象中的私有变量和公共变量.

这是一种完全可选的工作方式.

  • gs不正确,以_开头的实例变量很好.但是,以_开头的方法名称由Apple保留. (41认同)
  • Apple为自己的用途保留以_开头的变量.不要这样做. (24认同)
  • 如果可以的话,我会给+1 gs发表评论. (2认同)
  • 我(有限)的经验是:如果你继承了Apple的一个类,并添加了一个与超类私有ivars之一发生冲突的实例变量,Xcode通常会警告你(不管是否存在下划线).我已经提交了以这种方式格式化的代码(即,ivars以下划线开头)并且到目前为止还没有被拒绝. (2认同)

Ram*_*min 28

您所看到的是使用下划线来区分实例变量和属性.所以类声明可能是:

@interface Foo {
  NSString* _label;
  ....
}

@property (nonatomic, retain) NSString* label; // notice: no underline
Run Code Online (Sandbox Code Playgroud)

然后在实现文件中,您将拥有:

@synthesize label=_label; // the property is matched with the ivar
Run Code Online (Sandbox Code Playgroud)

现在,当在实现中时,如果你想直接访问实例变量,你可以使用_label但是要通过你将使用的属性访问器方法(它们负责保留/释放和一堆其他的簿记任务)self.label.从外面,您总是想要通过{object}.label酒店.

另一种方法是没有下划线,只使用:

NSString* label;
@property (nonatomic, retain) NSString* label;
...
@synthesize label;
Run Code Online (Sandbox Code Playgroud)

它的工作原理相同,但那么它可能会混淆的人读的代码,并试图跟踪labelVS self.label.我个人认为Apple公约(带下划线)更容易阅读,但这是一个偏好问题.

  • 谢谢.就个人而言,我不喜欢那下划线的混乱;) (2认同)
  • 由于我使用的是计时器而不是self.timer,因为变量未被保留,我只花了很长时间来追踪内存管理问题.在此经历之后,我强烈建议在所有私有变量前面使用_ (2认同)

Ser*_*pth 8

正如人们所说_someVar已经习惯说变量是私有的.这是一个简单的约定问题,并不重要.

另一个用途,在C a _function()中的回程机器中进行一次旅行表示一个不是平台可移植的函数,__ function()表示一个不是编译器可移植的函数.因此,在标准C库中,您有时会看到名称前面带有_或__的变量,这就是这些函数所代表的含义.