为什么在Objective C中的变量名之前加上下划线“_”

时间:2011-08-24 10:53:42

标签: objective-c

  

可能重复:
  How does an underscore in front of a variable in a cocoa objective-c class work?

在目标C中,我看到许多代码在变量名之前带有下划线,例如_someVariable

为什么?还有如何编写访问器,即获取和设置这种变量的方法。

3 个答案:

答案 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

现在,您可以让编译器执行此操作,而不是自己声明和编码访问器myIVarsetMyIVar:。在较新的版本中,您甚至不必在界面中声明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命名约定时,我觉得这是有用的和可读的。