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

Underscore prefix on property name?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How does an underscore in front of a variable in a cocoa objective-c class work?

有人能给我解释一下下划线的用法吗?我一直认为它们是用来强调你正在访问ivar [_window release];,而不是通过setter/getter方法[[self window] release];[self.window release];访问ivar。我只是想验证我的理解是否正确。

1
2
3
4
5
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UILabel *markerLabel;

@synthesize window = _window;
@synthesize markerLabel = _markerLabel;


在ivar名称中使用下划线是一种惯例,Apple首先使用下划线来区分实际的ivar和属性。自那以后,许多人通过了这项公约。

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

1
myIvar = newValue;

而不是

1
self.myIvar = myValue;

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


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

这个约定的另一个优点是,不使用setter就不能意外地访问ivar,因为

1
view = viewController.view ; // usually bad

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

不过,我通常不申报IVAR,只使用@property@synthesize。如果没有声明显式的ivar,编译器(至少是最近的一个)会自动生成ivar(同名),因此上面的代码编译时没有问题,并且不会防止不使用setter,但是您可以去掉一行代码……这可能是一个不好的目标,我不推荐给你:p