问题 属性名称上的下划线前缀? [重复]


可能重复:
在cocoa objective-c类中变量前面的下划线如何工作? 

任何人都可以指出我对下划线使用的解释,我一直认为他们习惯于强调你正在访问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;

9187
2018-04-07 14:07


起源

这就是我用它们的原因。 - Terry Wilcox
这曾经指向这里的另一个欺骗,这也很有趣 stackoverflow.com/questions/3521254/... - Dan Rosenstark


答案:


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

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

myIvar = newValue;

代替

self.myIvar = myValue;

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


10
2018-04-07 14:16



它真的被Apple使用了吗?无论如何,Apple不使用此约定。它在Cocoa编码指南中既未提及,也未在Apple自己的代码中使用,例如: developer.apple.com/library/mac/#samplecode/TreeView/Listings/... 下划线不会阻止您在使用实例变量时使用属性的错误。 - LearnCocos2D


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

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

view = viewController.view ; // usually bad

如果ivar是不会编译的 _view 代替 view

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


0
2018-04-07 14:14