2011-08-24 127 views

回答

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中。

+0

謝謝你的快速和接受,因爲你的例子正是我所看到的。 –

6

不要這樣做。

單引號下劃線是Apple內部編碼慣例。他們這樣做是爲了讓他們的伊娃名字不會與你的名字相沖突。如果您要在您的伊娃爾名稱上使用前綴,請使用以下任意字符,但只有一個下劃線。

+0

我認爲有些人也使用它來避免意外使用原始ivars而不是訪問器? – andyvn22

+1

謝謝你很好的exaplaination –

+0

'__variable'(兩個下劃線)是否意味着額外的危險呢?我意識到內部方法的慣例,但直到深入Apple庫時我纔看到這些方法 – Sirens

0

這是通常用於C++定義實例變量,其是私有的命名約定

像在類U可具有

private: 
int __x; 

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

這是一個命名約定,我被迫在使用C++。然而,我的老師從未告訴我們命名約定的名字。但是當我沒有使用java命名約定時,我覺得這是有用的,並且特別可讀。

+0

謝謝你的快速反應+1 –

+0

Java和Objective-C是兩種不同的語言。不要以爲你可以做Java,你應該在Objective-C中做到。 – SevenBits

+0

@SevenBits我想你沒有正確閱讀我的答案。我已經提到他們通常讓你的變量可讀。其次,java開發人員通常會遵循camelCase符號來實現可讀性。請在投票前正確閱讀答案。 – amod

相關問題