可能重复:
How does an underscore in front of a variable in a cocoa objective-c class work?
我在Apple的UIPickerView.h中看过这个:
id<UIPickerViewDataSource> _dataSource;
为什么强调那里?它有特殊意义吗?我必须知道的一项公约?
答案 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”(我讨厌那个)。我认为这是一个品味问题。