为什么Xcode会自动使用下划线创建变量?

GoG*_*hos 4 xcode objective-c declared-property

为什么在最新版本的Xcode(dp-4)中声明retain,nonatomic的变量是在变量名称之前使用下划线?这是否会产生某种类型的安全性?

例如,我创建了一个属性:

@property (retain, nonatomic) IBOutlet UILabel *name;
Run Code Online (Sandbox Code Playgroud)

除非我改变里面的变量dealloc而没有_,否则我必须这样做:

@synthesize name = _name;
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

SSt*_*eve 7

Mark Dalrymple,比我更聪明,在Big Nerd Ranch了一篇关于这个主题的博客文章.底线:下划线是一个好主意.我将在这里总结他的帖子,以防链接在将来停止工作,但如果可能的话,你应该阅读他的帖子而不是我的摘要.

当显式调用@synthesize是强制性的时候,他写了这篇文章.他提倡的代码如下:

// soapbubble.m
@synthesize viscosity = _viscosity;
@synthesize detergentBrand = _detergentBrand;
Run Code Online (Sandbox Code Playgroud)

这些天Xcode自动和隐含地包含@synthesize.它使用前置下划线这样做显然Apple的工程师同意Mark.

他的第一个理由是风格.它允许您轻松查看哪些变量是本地变量,哪些变量是setter中的参数:

- (void) setPonyName: (NSString *) ponyName {
    [_ponyName autorelease];
    _ponyName = [ponyName copy];
}
Run Code Online (Sandbox Code Playgroud)

(这是一个ARC之前的setter,所以现在这个方法完全没必要了,但是如果setter做了更多的事情,而不仅仅是释放和分配一个值,那么它仍然适用.)

他的第二个原因(也是我认为更重要的一个原因)是消除了一类很难追查的错误.

这段代码:

self.ponyName = @"Mikey";
Run Code Online (Sandbox Code Playgroud)

与以下内容相同:

[self setPonyName: @"Mikey"];
Run Code Online (Sandbox Code Playgroud)

如果没有前置下划线,此代码也有效:

ponyName = @"Mikey";
Run Code Online (Sandbox Code Playgroud)

但它不会调用setter,因此不会发生setter中的任何副作用.同样,在setter除了更改局部变量的值之外还做额外的工作的情况下,这可能会引起很大的麻烦.使用前置下划线,该行将导致编译错误.您必须非常明确地想要设置局部变量:

_ponyName = @"Mikey";
Run Code Online (Sandbox Code Playgroud)

而且,作为一名尽职尽责的程序员,你会包含一个评论,解释你为什么要进行这种不规则的操作.