为了账号安全,请及时绑定邮箱和手机立即绑定

属性名称上的下划线前缀?

/ 猿问

属性名称上的下划线前缀?

慕仰0522570 2019-08-19 17:24:35

属性名称上的下划线前缀?

任何人都可以向我指出使用下划线的解释,我一直认为它们用于突出显示您正在访问iVar [_window release];而不是通过setter / getter方法访问iVar,[[self window] release];或者[self.window release];我只是想验证我的理解是正确。


@property (nonatomic, retain) IBOutlet UIWindow *window;

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


@synthesize window = _window;

@synthesize markerLabel = _markerLabel;


查看完整描述

2 回答

?
慕森王

对于ivar名称使用下划线是Apple首先使用的惯例,用于区分实际的ivar和属性。此后很多人都采用了这个惯例。

这样做的原因是为了防止将新值分配给ivar而不是实际的setter的错误:

myIvar = newValue;

代替

self.myIvar = myValue;

如果您不小心使用了顶部示例,则可能导致内存泄漏。下划线阻止你犯这个错误。


查看完整回答
反对 回复 2019-08-19
?
幕布斯7119047

这是一个惯例,你的理解听起来不错。

这个约定的另一个优点是你不会在不使用setter的情况下意外访问ivar,因为

view = viewController.view ; // usually bad

如果ivar _view代替,则不会编译view

我通常不会宣布ivar,只是使用@property@synthesize。如果没有声明明确的ivar,编译器(至少是最近的一个)会自动生成ivar(具有相同的名称)。因此上面的代码编译没有问题,并且不用作防止不使用setter,但是你可以取消一行代码....这可能是一件坏事,我不建议你:p


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信