可能重复:
How does an underscore in front of a variable in a cocoa objective-c class work?
在目标C中,我看到许多代码在变量名之前带有下划线,例如_someVariable
为什么?还有如何编写访问器,即获取和设置这种变量的方法。
答案 0 :(得分:6)
下划线通常用于表示变量是实例变量。这不是必需的,因为 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];
}
FWIW,如果你想做的不仅仅是getter或setter的默认实现,你仍然可以自己编写其中一个或两个,但是你也必须要处理内存管理。在这种情况下,编译器将不再生成该特定访问器(但如果只有一个手动完成,另一个仍将生成)。
您可以访问属性
myString = self.myIVar;
或者,来自另一个班级:
theString = otherClass.myIVar;
和
otherClass.myIVar = @"Hello, world!";
在MyClass中,如果省略self.
,则会获得裸 ivar 。这通常只应在初始化程序和dealloc中使用。
答案 1 :(得分:6)
不要这样做。
单个前导下划线是Apple内部编码约定。他们这样做是为了让他们的名字不会与你的名字相冲突。如果您想在您的ivar名称上使用前缀,请使用除之外的任何内容。
答案 2 :(得分:0)
这是一个通常用于c ++的命名约定,用于定义私有的实例变量
就像你可能有的课程一样
private:
int __x;
public:
int GetX()
{
return this.__x;
}
这是一个命名约定,我被迫在c ++中使用。但是我的老师从未告诉我们命名惯例的名称。但是当我不使用Java命名约定时,我觉得这是有用的和可读的。