2011-04-07 119 views
11

可能重复:
How does an underscore in front of a variable in a cocoa objective-c class work?属性名称的下划线前缀?

任何人都可以点我使用下划线的解释,我一直认为它们是用来突出显示您正在访问的伊娃[_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; 
+0

这就是我使用它们的原因。 – 2011-04-07 14:25:30

+0

这用于指向这个其他的愚蠢,这也是有趣的太http://stackoverflow.com/questions/3521254/prefixing-property-names-with-an-underscore-in-objective-c – 2012-08-22 03:43:45

回答

0

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

本公约的另一个优点是,你可以不小心访问伊娃不使用二传手,因为

view = viewController.view ; // usually bad 

如果伊娃是_view而不是view将无法​​编译。

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

10

为伊娃名称使用下划线是一种惯例,首先由苹果区分真正的伊娃和财产。自那以后,许多人采纳了这一惯例。

这样做的原因是为了防止分配一个新的价值,伊娃的实际制定者,而不是错误:

myIvar = newValue; 

,而不是

self.myIvar = myValue; 

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

+2

它真的使用苹果?无论如何,Apple不会使用这个约定。它在“可可编码指南”中未提及,也未在Apple自己的代码中使用,例如:http://developer.apple.com/library/mac/#samplecode/TreeView/Listings/TreeViewDemo_View_TreeView_h.html#//apple_ref/doc/ uid/DTS40010131-TreeViewDemo_View_TreeView_h-DontLinkElementID_19 下划线不会阻止您在使用属性的情况下使用实例变量的错误。 – LearnCocos2D 2011-11-16 12:06:43

相关问题