可能重复:如何在cocoa objective-c类中使用变量前的下划线?
在Objective-C中,我经常看到变量名前有下划线,例如_someVariable。为什么会这样?另外,如何为这样的变量编写访问器(即获取和设置方法)?
下划线通常用于表示变量是实例变量。这并不是必要的,因为ivars可以与其属性和访问器具有相同的名称。
示例:
@interface MyClass : NSObject {
NSString *_myIVar; // can be omitted, see rest of text
}
// accessors, first one is getter, second one is setter
- (NSString *) myIVar; // can be omitted, see rest of text
- (void) setMyIVar: (NSString *) value; // can be omitted, see rest of text
// other methods
@property (nonatomic, copy) NSString *myIVar;
@end
myIVar
和setMyIVar:
,可以让编译器来完成。在较新的版本中,你甚至不需要在接口中声明myIVar
,只需声明属性,然后让编译器为你合成其余部分。在.m
文件中,你只需这样做:@implementation MyClass
@synthesize myIVar; // generates methods myIVar and setMyIVar: for you,
// with proper code.
// also generates the instance variable myIVar
// etc...
@end
确保最终化字符串:
- (void) dealloc {
[myIVar release];
[super dealloc];
}
如果您想要实现更多的getter或setter功能,可以自己编写其中一个或两个,但是这样您也需要注意内存管理。在这种情况下,编译器将不再生成特定的访问器(但如果只有一个手动完成,则另一个仍将生成)。
您可以通过以下方式访问属性:
myString = self.myIVar;
theString = otherClass.myIVar;
并且
otherClass.myIVar = @"Hello, world!";
self.
,则会得到裸的ivar。这通常只应在初始化程序和dealloc中使用。不要这样做。
单个下划线开头是苹果公司的一种内部编码规范。他们这么做是为了防止他们的实例变量名与你的变量名发生冲突。如果你想在实例变量名上使用前缀,请使用除了单个下划线之外的任何字符。
__variable
(两个下划线)是否意味着特别危险的内部变量?我知道有内部方法的约定,但在深入研究苹果库之前,我从未见过这些方法。 - Allison这是一种通常用于C++中定义私有实例变量的命名约定。
就像在一个类中,你可能会有:
private:
int __x;
public:
int GetX()
{
return this.__x;
}
这是一个命名约定,我在C++中被迫使用。然而,我的老师从未告诉我们这个命名约定的名称。但我觉得这很有用且易于阅读,特别是当您不使用Java命名约定时。