iPhone伊娃命名约定
可能重复:
如何在cocoaObjective-C类中的variables前面加下划线?
我注意到,在很多参考资料中,我发现很多时候,variables在.h文件中被命名为_variable,然后在.m文件中被合成为
@synthesize variable = _variable;
为什么这样做? 我错过了什么?
谢谢!
对此没有一致意见。 有些人喜欢用它来清晰地分离出类variables,另外一个响应者指出要避免与传入参数名称的冲突。 即使在Apple示例代码中,使用也是混合的。
不过,我非常喜欢不使用_
前缀,并有两个强有力的理由:
1)有人认为_
是“私人”的好指标。 我的意思是没有一个类的局部variables应该访问没有一个setter / getter(属性),因此他们都是私人的 – 为什么不命名他们更容易阅读和使用自动完成? 参数名称中的任何重叠部分都会被编译器快速显示出来,并且可以通过对参数(或内部variables)的更周到的命名来避免。
2)(更好的理由) – 如果在内部类var上使用XCode中的“refactor”,该类与用于访问它的属性名称相同,则属性和合成语句也将被重命名。 如果你在一个以_
为前缀的类variables上使用重构,属性名称将不会被改变 – 只是合成映射到内部名称。 我几乎不希望名称从属性变化到它暴露的实际variables。 仅凭这一点,我就不会希望使用_
作为variables前缀,因为能够改变名称只是为了提高代码清晰度而做的最有用的事情。
使用这种语法是一个选项,使其更清楚,伊娃和财产是不同的东西。
要在类的外部编码,因为它使用属性没有区别。
对于类本身的实现中的代码,它可以更加清楚当使用伊娃与财产。
例如,假设我们有一个NSNumber对象的ivar / property:
@interface MyClass : NSObject { NSNumber *num; } @property (nonatomic, retain) NSNumber *num; - (void)doSomething; @end @implementation MyClass @synthesize num; - (void)doSomething { // set the property, num is properly retained self.num = [NSNumber numberWithInteger:1]; // accidentally set the ivar, num is NOT retained num = [NSNumber numberWithInteger:2]; } @end
现在使用一个不同的名称为伊娃和财产:
@interface MyClass : NSObject { NSNumber *i_num; } @property (nonatomic, retain) NSNumber *num; - (void)doSomething; @end @implementation MyClass @synthesize num = i_num; - (void)doSomething { // set the property, num is properly retained self.num = [NSNumber numberWithInteger:1]; // compiler error, there is no ivar named "num" num = [NSNumber numberWithInteger:2]; // set the ivar, so it needs to be a retained object i_num = [[NSNumber alloc] initWithInteger:3]; } @end
以前的答案缺less这个背后的历史。 在Objective-C 2.0之前,没有任何属性。 所以你会有一个像这样的实例variables的对象:
@interface MyObject: NSObject { NSArray *myArray; } @end
但是,如何从其他对象访问它们? 解决的办法是制作二传手和获得者。 但为了避免混淆,他们会这样做:
@interface MyObject: NSObject { NSArray *_myArray; } - (NSArray *)myArray; - (void)setMyArray:(NSArray *)myArray; @end
_
用于清除实例variables_myArray
和方法-myArray
之间的混淆。
有时候人们使用mVarName(C ++),而在Obj-c中,风格似乎是_varName。 你可以有一个问题,想象你的一个函数的参数是… set:(int)x – 但是 – 你有一个名为x的iVar …好吧,你会得到编译器哭这样的东西 – 不提到它的混乱。
m,_,无论如何显示什么是类的成员属性。
-(void) set:(int)x { x = x; // x is an ivar! heh }
VS
-(void) set:(int)x { _x = x; // ahh I see! }
这纯粹是惯例。 我想它是共同的,因为当你做一个方法getter调用这样的:
[myObject variable]
你实际上正在调用一个方法,而不是直接访问一个variables。 前面的_表明你正在谈论一个variables。 就我个人而言,我觉得这个语法烦人和分心。 我觉得没有必要,但你是对的,它确实出现在这里和那里。
我宁愿不使用'_'前缀,因为苹果一贯使用它。 通过避免前缀,我有更大的信心,当我扩展一个cocoa触摸类时,我的ivars不会与苹果公司碰撞。 由于我们无法访问基类的源,所以这是我知道避免意外重用现有私有ivars的唯一方法。
很像
以“_”开头的单个下划线字符的方法名称保留供Apple使用。
在Google之后 ,我的首选是简单地附加一个下划线并明确合成(即使我正在重新实现):
@synthesize varName=varName_;
如果我看到在init...
, dealloc
或accessor之外的尾部下划线,我知道有什么可疑的。