Objective-C:在命名变量中使用_(下划线)

Jam*_*sev 7 objective-c naming-conventions

可能重复:
在Objective C中使用下划线前缀属性名称

在Objective-C的书中我正在阅读,在我看到的一些代码中,有时人们会在变量名称中添加下划线.

虽然我意识到这是由于一个既定的惯例,我想知道:

下划线是先于还是完成变量名称是否有任何意义?例如,_name, name and name_作为Objective-C程序员,如果有什么,下划线对您有意义吗?

Pau*_*l.s 18

这在很大程度上取决于个人风格和防守节目.但这是我个人使用并且看到人们使用前缀的主要原因.

这是为了让您更清楚地了解您是直接访问ivar还是使用getter/setter.

如果我有:

@property (nonatomic, retain) NSArray *people;
Run Code Online (Sandbox Code Playgroud)

和:

@synthesize people = _people;
Run Code Online (Sandbox Code Playgroud)

这将编译并生成如下的getter/setter声明:

- (void)setPeople:(NSArray *)people;
- (NSArray *)people;
Run Code Online (Sandbox Code Playgroud)

现在直接访问我需要使用的ivar:

_people
Run Code Online (Sandbox Code Playgroud)

要使用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];
Run Code Online (Sandbox Code Playgroud)

现在在我的代码中如果我不小心只输入:

people = newPeople; // will not compile
Run Code Online (Sandbox Code Playgroud)

它不会编译,因为我没有使用getter/setter,并且没有ivar people应该是_people.


NSR*_*der 5

单个前导下划线是Apple内部编码约定,他们这样做是为了使它们的符号不会与您的符号冲突.不幸的是,苹果公司一直在发布遵循这种习惯的代码示例,所以苹果以外的很多人都认为这是一件好事.

如果要在ivar和方法名称上使用前缀,请使用除单个前导下划线之外的任何内容.