【问题标题】:Underscore prefix on property name? [duplicate]属性名称的下划线前缀? [复制]
【发布时间】:2011-07-31 17:54:53
【问题描述】:

可能重复:
How does an underscore in front of a variable in a cocoa objective-c class work?

谁能指出下划线使用的解释,我一直认为它们用于强调您正在访问 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;

【问题讨论】:

标签: objective-c cocoa-touch


【解决方案1】:

在 ivar 名称中使用下划线是 Apple 首次用于区分实际 ivar 和属性的约定。此后,许多人都采用了这一约定。

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

myIvar = newValue;

而不是

self.myIvar = myValue;

如果您不小心使用了上面的示例,可能会导致内存泄漏。下划线可防止您犯此错误。

【讨论】:

【解决方案2】:

这是一个约定,您的理解听起来不错。

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

view = viewController.view ; // usually bad

如果 ivar 是 _view 而不是 view,则不会编译。

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

【讨论】: