为什么在C中的变量名前加下划线

Why put underscore “_” before variable names in Objective C

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How does an underscore in front of a variable in a cocoa objective-c class work?

在目标C中,我看到许多代码在变量名前加下划线,例如somevariable

为什么会这样?另外,如何编写访问器,即获取和设置此类变量的方法。


不要这样做。

单前导下划线是一种Apple内部编码约定。他们这样做是为了让他们的ivar名字不会与你的名字冲突。如果要在ivar名称上使用前缀,请使用除单个下划线之外的任何内容。


下划线通常用来表示变量是实例变量。这不是真正必要的,因为ivar可以与它们的属性和访问器具有相同的名称。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
@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文件中,您需要:

1
2
3
4
5
6
7
8
@implementation MyClass
@synthesize myIVar; // generates methods myIVar and setMyIVar: for you,
                    // with proper code.
                    // also generates the instance variable myIVar

// etc...

@end

请确保完成字符串:

1
2
3
4
- (void) dealloc {
    [myIVar release];
    [super dealloc];
}

fwiw,如果您想做的不仅仅是getter或setter的默认实现,您仍然可以自己编写其中的一个或两个代码,但随后您还必须处理内存管理。在这种情况下,编译器将不再生成该特定的访问器(但如果只手动完成一个访问器,则仍将生成另一个访问器)。

属性访问方式为

1
myString = self.myIVar;

或者,来自另一类:

1
theString = otherClass.myIVar;

1
otherClass.myIVar = @"Hello, world!";

在我的课堂上,如果你省略了self.,你就得到了最简单的ivar。这通常只能在初始值设定项和dealloc中使用。


这是一个命名约定,通常用于C++来定义实例变量,这些变量是私有的。

就像在U班

1
2
3
4
5
6
7
8
private:
int __x;

public:
int GetX()
{
  return this.__x;
}

这是一个命名约定,我被迫在C++中使用。然而,我的老师从未告诉我们命名约定的名称。但我觉得这是有用的和可读的,特别是当你不使用Java命名约定。