属性名称的下划线前缀?

可能重复:
如何在cocoaObjective-C类中的variables前面加下划线?

任何人都可以指出我对下划线的使用的解释,我一直认为它们是用来强调你正在访问的iVar [_window release]; 而不是通过setter / getter方法访问iVar [[self window] release];[self.window release]; 我只是想validation我的理解是正确的。

 @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UILabel *markerLabel; @synthesize window = _window; @synthesize markerLabel = _markerLabel; 

对伊娃名称使用下划线是苹果公司首先使用的一种惯例来区分真正的伊娃和财产。 从那以后,很多人都采用这个惯例。

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

 myIvar = newValue; 

代替

 self.myIvar = myValue; 

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

这是一个惯例,你的理解听起来很好。

这个惯例的另一个优点是你不能不使用setter而意外地进入ivar,因为

 view = viewController.view ; // usually bad 

如果伊娃是_view而不是view则不会编译。

我通常不会声明伊娃,只是使用@property@synthesize 。 如果没有明确的ivar声明,编译器(至less最近一个)会自动生成ivar(具有相同的名称)。因此,上面的代码编译没有问题,并没有防止不使用setter,但你可以取消一行代码….这可能是一个不好的事情,我不推荐给你:页