2011-09-14 43 views
-2

可能重複:
Prefixing property names with an underscore in Objective C目標C代碼格式化

通常當我下載樣品目標C語言源代碼,我看到以下內容:

在MyClass的界面,。 h文件:

MyObject *_myObject; 

在MyClass的實現,.m文件:

@interface MyClass() 

@property (nonatomic, retain) MyObject *myObject; 

@end 

@implementation MyClass 

@synthesize myObject = _myObject; 

... 

誰能向我解釋爲什麼我會不只是申報的MyObject * myObject的在.h文件中,也包括財產申報就在.H文件?爲什麼他們聲明* _myObject?當你有@synthesize varA = varB時,這意味着什麼?

謝謝!

+0

它是'@ synthesize',而不是'@ synthesis'。 –

回答

3

有兩個獨立的事情發生在這裏:

  1. 私人訪問:財產是被稱爲「擴展」,因此,它是私人和外部類不可見的一個無名類聲明。
  2. 一個不同名稱的伊娃:伊娃支持的屬性命名的東西從屬性本身不同的*這就是@synthesize myObject = _myObject;意味着:它意味着合成myObject物業,但要設置_myObject變量,而不是myObject(其不存在,就像你注意到的那樣)。

*有各種原因要做到這一點,通常涉及避免[self myObject]myObject之間的混淆(通過使後者不存在)。

+0

我喜歡這個。代碼背後的實際目的的簡明扼要說明,而不僅僅是各條線的意思。 – Chuck

+0

當你想讓伊娃成爲一個屬性時,總是要做一個不同名稱的伊娃,這是否是一個好習慣,迫使你總是通過合成的getter/setter方法而不是直接訪問屬性? –

+1

通過訪問者(幾乎)總是訪問該屬性是個好習慣,但是個人而言,我更喜歡這樣做,並且只保留我的變量名。我沒有發現自己不小心混淆了'[self myObject]'和'myObject'。 – andyvn22

0

即使Why does C++ need a separate header file?是C++,這可以適用於Objective-C的過

關於@synthesize

的@synthesize指令自動生成setter和 干將我們,所以我們所有的爲此類實現的是 dealloc方法。

訪問器只有在它們不存在的情況下才會生成,所以感覺 可以爲屬性指定@synthesize,然後根據需要實現您的自定義 getter或setter。編譯器將填寫缺失方法 。

http://cocoadevcentral.com/d/learn_objectivec/

1
@synthesize /* not @synthesis */ varA = varB; 

varB因爲伊娃的財產varA

有沒有直接的需要,但有些人更喜歡它更容易區分財產和伊娃。其實,如果財產和伊娃擁有相同的名稱(如果您沒有手動指定伊娃),您可以通過self.來區分它們:self.xyz是屬性,而xyz(無self.)是相應的伊娃。

我用我的ivars給予不同的名稱太多,但目前,我只是喜歡:

@property (retain) NSSomeType *xyz; 

@synthesize xyz; 

,讓編譯器把剩下的事情。

1

命名ivars與屬性不同的原因是,它使代碼中非常明顯的ivar使用不正確。例如,請考慮以下一行代碼:

myObject = [self something]; 

它是正確的嗎?那麼,這取決於myObject是一個ivar還是一個局部變量。如果它是本地的,這幾乎肯定是好的。如果它是一個伊娃,這可能是一個泄漏,並且很可能也是一個欠保留並且將來會崩潰。如果高德有特殊的名稱(如谷歌風格尾隨下劃線),那麼它很清楚,這是不正確的:

myObject_ = [self something]; 

而且它也很清楚,這是正確的:

self.myObject = [self something]; 

我個人更喜歡Google的尾部下劃線樣式,因爲領先的下劃線ivars在valueForKey:中有一些特殊情況處理,我更喜歡避免特殊情況下的魔法。