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

时间:2009-05-07 23:28:10

标签: iphone objective-c cocoa cocoa-touch

  

可能重复:
  How does an underscore in front of a variable in a cocoa objective-c class work?

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

id<UIPickerViewDataSource> _dataSource;

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

8 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:28)

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

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

@property (nonatomic, retain) NSString* label; // notice: no underline

然后在实现文件中你会得到:

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

现在在实现中,如果你想直接访问实例变量,你可以使用_label但是要通过属性访问器方法(它们处理保留/释放和一堆其他书籍 - 保持任务)你会使用self.label。从外面看,您总是希望通过{object}.label属性。

另一种方法是在没有下划线的情况下使用:

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

它的工作方式相同,但是可能会让读取代码并尝试跟踪label vs self.label的人感到困惑。我个人觉得Apple的约定(带下划线)更容易阅读,但这是一个偏好的问题。

答案 2 :(得分:8)

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

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

答案 3 :(得分:2)

它有时用于表示私有变量。更一般地,它只是意味着“这个变量在某种程度上是不同的。”

答案 4 :(得分:2)

可能是......(慢跑记忆)...

我依稀记得读一篇ADC文件,解释苹果保留使用下划线前缀成员变量?并且不鼓励第三方开发人员使用此约定以避免冲突?

| K&LT;

答案 5 :(得分:2)

我使用下划线表示变量是成员,类似于匈牙利表示法中的'm'前缀(我鄙视这种符号,但这是另一个故事)。当然你现在得到了颜色编码的编辑器,但我的观点是前缀让你在输入之前考虑变量是的成员/实例,而不仅仅是在它变色之后的某个时间 - 由编辑编码。

答案 6 :(得分:1)

通常,它表示开发人员不应直接触及变量。这不是一个真正的要求,但如果你不能避免在一个你不想搞砸的类中有一个公共变量,这是一个好习惯。

答案 7 :(得分:1)

我选择使用下划线来制作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”(我讨厌那个)。我认为这是一个品味问题。