可能重复:
Prefixing property names with an underscore in Objective C
在Objective-C书中我正在阅读,在我看到的一些代码中,有时人们会在变量名称中添加下划线。
虽然我意识到这是由于已建立的惯例,我想知道:
下划线是先于还是完成变量名称是否有意义?
例如,以_name, name and name_
作为Objective-C程序员,如果有什么,下划线对您有意义吗?
答案 0 :(得分:18)
这很大程度上取决于个人风格和防御性编程。但这是我个人使用并且看到人们使用前缀的主要原因。
这样做可以让您更清楚地了解您是直接访问ivar还是使用getter / setter。
如果我有:
@property (nonatomic, retain) NSArray *people;
和
@synthesize people = _people;
这将编译并生成如下的getter / setter声明:
- (void)setPeople:(NSArray *)people;
- (NSArray *)people;
现在要直接访问我需要使用的ivar:
_people
要使用getter / setter,我可以使用点表示法或getter / setter,如:
[self people];
// or
self.people; // which compiles to [self people];
// and
[self setPeople:newPeople];
// or
self.people = newPeople; // which compiles to [self setPeople:newPeople];
现在在我的代码中,如果我不小心输入:
people = newPeople; // will not compile
它不会编译因为我没有使用getter / setter而且没有名为people
的ivar应该是_people
。
答案 1 :(得分:5)
单个前导下划线是Apple内部编码约定,他们这样做是为了使它们的符号不会与您的符号冲突。不幸的是,苹果公司对于发布遵循这种习惯的代码示例一直很草率,因此很多Apple以外的人都认为这是一件好事。
如果您想在您的ivar和方法名称上使用前缀,请使用除了单个前导下划线之外的任何内容。
答案 2 :(得分:3)
如果您确实使用了这样的变量名称,那么肯定不应该使用以下划线后跟大写字母开头的任何名称。 C标准保留所有此类标识符用于任何用途(第7.1.3节):
所有以下划线开头且以大写字母或其他下划线开头的标识符始终保留供任何使用。
,即C语言(或给定编译器)的未来版本可能使用任何此类标识符作为关键字或库函数名称,这可能会破坏您的程序。鉴于此,我宁愿根本不使用以下划线为前缀的名称;你可能知道在下划线后不要使用大写字母,但这并不能阻止新人出现并做到这一点。
此外,以下划线开头的所有标识符都保留在文件范围内;另一个需要提防。
答案 3 :(得分:1)
下划线并不意味着什么,但是当你使用它们时,更难以犯this one之类的错误,但我从未见过有人在最后使用下划线,只是在开始时会建议你反对最后添加,因为可能不清楚这些东西是什么意思。
我并没有在我的Objective-C代码中添加下划线,但它主要是品味而非意义。只需确保不在名称的中间或末尾添加下划线:)
答案 4 :(得分:1)
下划线表示私有,我的人员不使用它我的自我ivars,因为你总是可以使用@private,你可以将.dar添加到.m文件中的接口扩展名甚至是代码的@implementaion部分,它最近随着属性的出现变得很普遍,所以你可以使用它来保护自己在代码而不是属性中意外访问ivar,因为编译器可以告诉你错误,在c编程中我将使用领先的得分为了表明函数不是自包含的,它将由另一个函数使用,并且也将在iv中使用它在C ++中,因为C ++不喜欢成员函数和ivars具有相同的名称。