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

Jav*_*aby 14 objective-c

可能重复:
cocoa objective-c类中变量前面的下划线如何工作?

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

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

Rud*_*uis 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
Run Code Online (Sandbox Code Playgroud)

现在,您可以让编译器执行此操作,而不是对访问器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
Run Code Online (Sandbox Code Playgroud)

一定要完成字符串:

- (void) dealloc {
    [myIVar release]; 
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

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

您可以访问属性

myString = self.myIVar;
Run Code Online (Sandbox Code Playgroud)

或者,从另一个班级:

theString = otherClass.myIVar;
Run Code Online (Sandbox Code Playgroud)

otherClass.myIVar = @"Hello, world!";
Run Code Online (Sandbox Code Playgroud)

在MyClass的,如果省略self.,你得到的裸伊娃.这通常只应在初始化程序和dealloc中使用.


NSR*_*der 6

不要这样做.

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