首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Xcode会自动创建带下划线的变量?

为什么Xcode会自动创建带下划线的变量?
EN

Stack Overflow用户
提问于 2013-01-02 08:59:25
回答 2查看 3.4K关注 0票数 4

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

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

代码语言:javascript
复制
@property (retain, nonatomic) IBOutlet UILabel *name;

除非我将dealloc中的变量更改为没有_,否则我必须这样做:

代码语言:javascript
复制
@synthesize name = _name;

为什么会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-02 09:16:33

Mark Dalrymple,他比我聪明得多,写了一篇关于这个主题的a blog post at Big Nerd Ranch。底线:加下划线是个好主意。我将在这里总结他的帖子,以防链接在未来停止工作,但如果可能的话,你应该阅读他的帖子,而不是我的总结。

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

代码语言:javascript
复制
// soapbubble.m
@synthesize viscosity = _viscosity;
@synthesize detergentBrand = _detergentBrand;

如今,Xcode自动且隐式地包含@synthesize。而且它使用了前缀下划线,所以显然苹果的工程师同意Mark的观点。

他的第一个原因是风格。它允许您轻松查看哪些变量是局部变量,哪些是setter中的参数:

代码语言:javascript
复制
- (void) setPonyName: (NSString *) ponyName {
    [_ponyName autorelease];
    _ponyName = [ponyName copy];
}

(这是一个ARC前的设置器,所以现在这个方法完全没有必要了,但是如果设置器做了比简单地释放和赋值更复杂的事情,它仍然会应用。)

他的第二个原因(也是我认为更重要的一个)是消除了一类很难追踪的bug。

这段代码:

代码语言:javascript
复制
self.ponyName = @"Mikey";

等同于:

代码语言:javascript
复制
[self setPonyName: @"Mikey"];

如果没有预加下划线,则此代码也有效:

代码语言:javascript
复制
ponyName = @"Mikey";

但是它不会调用setter,所以setter中不会出现任何副作用。同样,在setter除了更改局部变量的值之外还要做额外工作的情况下,这可能会造成很大的麻烦。如果加上下划线,该行将导致编译错误。您必须非常明确地说明想要设置一个局部变量:

代码语言:javascript
复制
_ponyName = @"Mikey";

而且,作为一名尽职尽责的程序员,您应该包括一条注释,确切地解释为什么要执行这种不规则的操作。

票数 7
EN

Stack Overflow用户

发布于 2013-01-02 13:25:54

@synthesize name = _name中的"_name“只是您的Xcode自动创建的一个变量名。这样做是因为@synthesize只创建了setter和getter,如果你不使用_name,它将接受你的属性名,即name (在本例中),并最终在你的应用程序中导致错误。_name只是一种命名约定。您可以使用任何变量名来代替_name。以便@synthesize在其实现中使用该变量名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14115774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档