Objective C / C中的命名约定,以“_”开头?

我看到ppl的东西定义了这样的变量:

b2World *_world; b2Body *_body; CCSprite *_ball; 

代替

 b2World *world; b2Body *body; CCSprite *ball; 

我熟悉第二个,但不是第一个。 所以,我检查了维基百科有关命名约定的内容:

以双下划线或下划线和大写字母开头的名称保留用于实现(编译器,标准库),不应使用(例如__reserved或_Reserved)。

那么,是否有以“_”开头的任何特殊含义?

我看到使用“_”开始的代码在这里:

http://www.raywenderlich.com/457/intro-to-box2d-with-cocos2d-tutorial-bouncing-balls

维基页面。

在一些Objective-C开发人员中,有一个长期惯例,即使用下划线为实例变量添加前缀。 它有以下几种方式:一,它可以更容易地发现.m文件中的实例变量; 二,它使开发人员不必为方法参数提出创意名称,以避免与实例变量名冲突; 正如其他人所指出的那样,它表示实例变量是私有的,因此不应该在整个代码中无法访问它们。

实际上,我认为避免直接在访问器(getter和setter),- -dealloc-init...之外的方法中访问实例变量。 并不是说你永远不应该在其他任何地方使用它们,但是在其他方法中直接使用实例变量之前,你至少应该考虑一下。

这真的很有帮助,但大多数人都不知道为什么,这是一种耻辱。 Apple使用下划线来分隔其他对象访问特定对象变量的方式,以及特定对象访问其自身变量的方式。 现在这可能听起来有点奇怪,但想象如下:您可能都认识到以下编译器警告

 .h @property (nonatomic, retain, readonly) UITableView *tableView; .m - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [self loadSomethingElseForTableView:tableView]; } 

这将导致编译器警告,因为它不知道您是否引用了局部变量“tableView”或实例变量。 因此,Apple建议您将以下内容添加到@implementation的顶部。

 @synthesize tableView = _tableView; 

现在,当您引用_tableView ,编译器知道您指的是实例变量,而不是本地变量。

此外,这使得更容易理解Obj-C中的垃圾收集,并防止出现常见错误。

例如,执行以下操作时:

 @property (nonatomic, retain, readonly) NSString *title; - (id)initWithTitle:(NSString *)title { if ((self = [super init])) { self.title = title; // Is not possible, since it's read only. title = title; // Is not possible, since it's the same (local) variable. // Changing the method to initWithTitle:(NSString *)aTitle; title = aTitle; } return self; } 

现在,既然你没有使用默认的setter(实际上,你不能,因为它是只读的)你需要自己保留变量。 当你为每个实例变量赋一个前缀时,这会更容易记住(所以你知道你需要自己保留它)。

因此,基本上,了解self.variable和( _variable之间的区别非常重要。 (即: self.variable映射到[self setVariable:...]variable直接映射到指针。

此外,当您将其添加为私有变量时,如下所示:

 @interface TSSomeObject : NSObject { @private NSString *_privateTitle; } @end 

除非您遇到具有相同名称的局部变量,否则下划线前缀不是必需的。 除此之外,同样,它也是一种简单的方法来提醒您它是一个本地指针,并且在将变量分配给对象时需要保留(和释放)变量。

有什么问题是创建一个带下划线前缀的属性,如下所示:

 @property (nonatomic, retain) NSString *_title; 

这是非常错的,我甚至不会解释为什么;)


所以是的! 你应该使用下划线前缀,它使你的代码更容易阅读,并由编译器解释! 在Xcode 4中,Apple甚至将这些@synthesize添加到默认模板中。

通常它们用于不应在当前文件/模块/命名空间/之外访问的变量,在不支持使用private关键字等限制访问的语言中

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-1001757

根据上述文档中的约定和建议,您应该在ivars前加下划线。

不可否认,它是指为属性明确设置ivars。

但用法是相同的,以表明ivar在任何地方的使用情况。

然而,我对这种可能性持开放态度,在这种情况下,使用下划线前缀的ivar可以向用户发出信号,表明他们做错了什么。 同时,后固定下划线可用于纯粹的ivars,可直接访问。

这个博客有一些经验丰富的从业者的好想法,它建议使用前缀下划线。

http://blog.bignerdranch.com/463-a-motivation-for-ivar-decorations/

如果您选择使用带前缀的下划线来装饰自己的伊娃,那么至少有一些证据表明某种装饰可以帮助您避免虫子。 前缀下划线是最常见的装饰。

Apple保留以下划线开头的名称,用于自己的私人ivars和方法。 在任何Apple平台上的Objective-C中,建议您不要在标识符前加下划线。

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html