加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 为什么Xcode会自动创建带下划线的变量?

发布时间:2020-12-14 18:02:59 所属栏目:百科 来源:网络整理
导读:为什么在最新版本的 Xcode(dp-4)中使用retain声明变量,非原子使用变量名之前的下划线?这是否会产生某种类型的安全性? 例如,我创建了一个属性: @property (retain,nonatomic) IBOutlet UILabel *name; 除非我将dealloc中的变量更改为不具有_,否则我必须这
为什么在最新版本的 Xcode(dp-4)中使用retain声明变量,非原子使用变量名之前的下划线?这是否会产生某种类型的安全性?

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

@property (retain,nonatomic) IBOutlet UILabel *name;

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

@synthesize name = _name;

为什么是这样?

解决方法

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

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

// soapbubble.m
@synthesize viscosity = _viscosity;
@synthesize detergentBrand = _detergentBrand;

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

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

- (void) setPonyName: (NSString *) ponyName {
    [_ponyName autorelease];
    _ponyName = [ponyName copy];
}

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

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

这段代码:

self.ponyName = @"Mikey";

与以下内容相同:

[self setPonyName: @"Mikey"];

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

ponyName = @"Mikey";

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

_ponyName = @"Mikey";

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读