2012-05-03 59 views
0

下劃線最近,我拿起書BigNerdRanch可可爲Mac OSX和正在尋找周圍使用星號*的一個很好的解釋,並強調_,似乎整個語言使用不一致。一些例子:澄清星號和可可語法

這些似乎是功能上等同:

NSString* myString; 
NSString *myString; 

有時候,新的變量得到一個下劃線,而其他人不:

NSString _myString; 
NSString myString; 

有時它會都瘋了:

NSString *myString; 
NSString *_myString; 

我也看到了方法中帶有星號的變體:

- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender 
      willSpeakWord:(NSRange)characterRange 
       ofString:(NSString *)string; 

那麼什麼是星號或下劃線的功能用途,什麼時候應該使用(或不使用)或者什麼時候應該結合使用?

+5

*表示一個指針(讀了在C編程中),'_'只是另一個字母數字字符,並不代表任何東西(除非作爲一些程序員喜歡使用的變量名稱的指南)。請參閱http://stackoverflow.com/questions/822487/how-does-an-underscore-in-front-of-a-variable-in-a-cocoa-objective-c-class-work – Vervious

+0

只是爲了澄清:第二組變量定義是錯誤的,並且不會編譯或崩潰。對象(即NSObject的子類必須用指針(* thingy))來定義)。不是對象的變量(例如int,float,char)必須定義爲不帶*。 – thundersteele

回答

2

*指示所有Objective-C對象都是的指針。 (你在內存中傳遞指向這些對象的指針)。在基本級別上,這些是普通的C指針。如果我沒有記錯你可以通過object->data訪問Objective-C對象中的一些數據,就像你使用指向C結構的指針一樣。

_是一個Cocoa(和其他一些語言)的約定,意思是「應該被認爲是私有的這個對象的一塊數據」。

的Objective-C具有@private聲明,但它也是一個相對較新的語言 - 如果你的代碼超過2或3歲(或針對更老版本的OS X),它可能不會使用@private

由於最初缺乏語言基礎設施,Cocoa社區經常使用_來標記「嘿,您可能不應該直接設置或閱讀此內容」。

所以:

  • 當與Objective-C類處理,你總是需要*跟着類名(如NSString),因爲他們總是指針。我對您的代碼中的NSString somestring行感到困惑 - 要麼會生成編譯器警告,要麼在您嘗試使用時發生崩潰
  • _表示私有數據。您可以在Objective-C類的@interface部分中執行類似NSString* _name的操作。如果您正在通過班級中的某種方法調用或操作該數據,您會自行使用_name

所以說,你創建一個學生類:

// Student.h 
@interface Student : NSObject { 
    NSString* _name; 

} 

- (NSString*) name_as_caps; 
@end 


// Student.m 

@implementation Student 
- (NSString*) name_as_caps { 
    return [_name uppercase]; 
} 

這裏我們聲明一個類與「私有」的數據成員:_name。由於某種原因,我們的Student類需要返回大寫,因此我們創建了一個方法來實現這一點,我們使用_name並調用uppercase方法。

我們需要在這裏引用類型(或類名)或_name幾次:一次,聲明變量。對於name_as_caps我們需要說:this method returns a pointer to an NSString object,因此我們使用NSString *

+1

'@ private'在Objective-C中一直存在(至少在Apple下)。新的是'@ package'。 http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocDefiningClasses.html#//apple_ref/doc/uid/TP30001163-CH12-TPXREF127另外,值得注意的是_ '對編譯器沒有任何意義;它只是程序員常用的名稱的一部分,意味着(相互)「這是私人的」。 –

+0

關於@private的好處 - 我在想方法,而不是數據。無論如何,蘋果公司使用_作爲他們的私有變量,所以其要點仍然正確:) – RyanWilcox

+0

實際上,在經典的運行時中,你顯然不應該爲變量使用_前綴,因爲它們可能會與Apple定義的變量發生衝突超。 (這就是爲什麼大多數書籍都使用_後綴代替的原因)。但是,在現代運行時中,碰撞不是問題,Apple現在建議在定義插槽變量以備份屬性時使用_前綴(特別是與合成。) – abarnert

0

作爲附錄瑞安的答案,當你看到這樣

-(void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)character 
RangeofString:(NSString *)string; 

(NSSpeechSynthesizer *)sender的事情只是陳述參數的類型 - 在這種情況下NSSpeechSynthesizer *