可能重複:
How does an underscore in front of a variable in a cocoa objective-c class work?爲什麼把下劃線「_」變量名之前的目標C
在客觀CI我看到大量的代碼用下劃線之前的變量名,例如_someVariable
這是爲什麼?還有如何編寫訪問器,即獲取和設置這種變量的方法。
可能重複:
How does an underscore in front of a variable in a cocoa objective-c class work?爲什麼把下劃線「_」變量名之前的目標C
在客觀CI我看到大量的代碼用下劃線之前的變量名,例如_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];
}
FWIW,如果你想要做多的getter或setter的默認實現做,你可以仍然自己編碼一個或兩個,但是你也必須關心內存管理。在這種情況下,編譯器不會再生成該特定的訪問器(但是如果只有一個手動完成,另一個仍將生成)。
您訪問屬性
myString = self.myIVar;
,或者從其它類:
theString = otherClass.myIVar;
和
otherClass.myIVar = @"Hello, world!";
在MyClass的,如果省略self.
,你得到的裸ivar。這通常只應用於初始化程序和dealloc中。
謝謝你的快速和接受,因爲你的例子正是我所看到的。 –
這是通常用於C++定義實例變量,其是私有的命名約定
像在類U可具有
private:
int __x;
public:
int GetX()
{
return this.__x;
}
這是一個命名約定,我被迫在使用C++。然而,我的老師從未告訴我們命名約定的名字。但是當我沒有使用java命名約定時,我覺得這是有用的,並且特別可讀。
upvoting,因爲我覺得我們應該熟悉各種標準的命名約定。 – amod