你什么时候在一个实例variables前做一个下划线?

可能重复:
如何在cocoaObjective-C类中的variables前面加下划线?

我在Apple的UIPickerView.h里看到过这个:

id<UIPickerViewDataSource> _dataSource; 

那为什么突出呢? 它有特殊的意义吗? 一个我必须知道的公约?

很多人使用私有variables来区分私有variables和对象内的公共variables。

这是一个完全可选的工作方式。

你所看到的是使用下划线来区分实例variables和属性。 所以一个类的声明可能是:

 @interface Foo { NSString* _label; .... } @property (nonatomic, retain) NSString* label; // notice: no underline 

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

 @synthesize label=_label; // the property is matched with the ivar 

现在,在实现中,如果你想直接访问实例variables,你可以使用_label但要通过属性访问器方法(保留/释放和其他一些簿记任务),你会使用self.label 。 从外面看,你总是会想通过{object}.label属性。

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

 NSString* label; @property (nonatomic, retain) NSString* label; ... @synthesize label; 

它的工作方式是一样的,但是可能会让某人阅读代码并试图跟踪label vs self.label 。 我个人认为苹果公约(带有下划线)更容易阅读,但这是一个偏好问题。

正如人们所说,已经用_someVar来说variables是私有的。 这是一个简单的约定,并不重要。

另外一个用途,在C a _function()的wayback机器中旅行,代表一个不是平台可移植的函数,而__function()代表一个不是编译器可移植的函数。 因此,在标准的C库中,有时候会看到一个名称为_或__ infront的variables,这就是这些函数所代表的。

它有时用来表示私有variables。 更一般地说,它只是意味着“这个variables是不同的”。

可以这样…(慢跑记忆)…

我隐约记得阅读一个ADC文件解释说,苹果保留使用下划线 – 前缀成员variables? 而第三方开发者不鼓励使用这个约定来避免碰撞?

| K <

我用下划线来表示一个variables是一个成员,与匈牙利符号中的'm'前缀相似(这个符号我完全鄙视,但那是另外一个故事)。 当然,你现在可以使用颜色编码编辑器了,但是我认为前缀使得你在inputvariables之前先考虑variables是一个成员/实例,而不是之后的某个时候编辑器使用颜色编码。

一般来说,这表示一个variables不应该被开发人员直接触及。 这不是一个真正的要求,但是如果你不能避免在一个你不想要的混淆的类中使用公共variables,这是一个很好的习惯。

我select使用下划线为ivars,因为我经常遇到以下情况:

 @interface MyClass:NSObject { NSUInteger count; } @property(nonatomic) NSUInteger count; -(id) initWithCount(NSUInteger) count; @end (...) @implementation MyClass @synthesize count; -(id) initWithCount(NSUInteger) count { if((self = [super init])){ self.count = count; // Parameter name collides with ivar name! } return self; } @end 

所以我这样做:

 @interface MyClass:NSObject { NSUInteger _count; } @property(nonatomic) NSUInteger count; -(id) initWithCount(NSUInteger) count; @end (...) @implementation MyClass @synthesize count = _count; -(id) initWithCount(NSUInteger) count { if((self = [super init])){ _count = count; // No name collision } return self; } @end 

当然,我可以改变参数名称为“newCount”或“aCount”(我讨厌那个)。 我认为这是一个品味问题。