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

fuz*_*oat 11 cocoa-touch objective-c

可能重复:
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;
Run Code Online (Sandbox Code Playgroud)

voi*_*dzm 10

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

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

myIvar = newValue;
Run Code Online (Sandbox Code Playgroud)

代替

self.myIvar = myValue;
Run Code Online (Sandbox Code Playgroud)

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

  • 它真的被Apple使用了吗?无论如何,Apple不使用此约定.它在Cocoa编码指南中既未提及也未在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下划线不会阻止您在使用实例变量的地方时使用该属性. (2认同)

Yuj*_*uji 0

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

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

view = viewController.view ; // usually bad
Run Code Online (Sandbox Code Playgroud)

_view如果 ivar代替 则不会编译view

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