2011-04-07 120 views
11

可能重複:
How does an underscore in front of a variable in a cocoa objective-c class work?屬性名稱的下劃線前綴?

任何人都可以點我使用下劃線的解釋,我一直認爲它們是用來突出顯示您正在訪問的伊娃[_window release];而不是通過setter/getter方法訪問iVar [[self window] release];[self.window release];我只想驗證我的理解是否正確。

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) IBOutlet UILabel *markerLabel; 

@synthesize window = _window; 
@synthesize markerLabel = _markerLabel; 
+0

這就是我使用它們的原因。 – 2011-04-07 14:25:30

+0

這用於指向這個其他的愚蠢,這也是有趣的太http://stackoverflow.com/questions/3521254/prefixing-property-names-with-an-underscore-in-objective-c – 2012-08-22 03:43:45

回答

0

這是一個慣例,你的理解聽起來很好。

本公約的另一個優點是,你可以不小心訪問伊娃不使用二傳手,因爲

view = viewController.view ; // usually bad 

如果伊娃是_view而不是view將無法​​編譯。

我通常不會宣佈伊娃,但只是使用@property@synthesize。如果沒有明確的ivar聲明,編譯器(至少是最近的一個)會自動生成ivar(具有相同的名稱)。因此,上面的代碼編譯沒有問題,並且不能防止不使用setter,但是您可以取消一行代碼....這可能是一件壞事,我不推薦給你:p

10

爲伊娃名稱使用下劃線是一種慣例,首先由蘋果區分真正的伊娃和財產。自那以後,許多人採納了這一慣例。

這樣做的原因是爲了防止分配一個新的價值,伊娃的實際制定者,而不是錯誤:

myIvar = newValue; 

,而不是

self.myIvar = myValue; 

如果不小心使用頂部的例子,你可能會導致內存泄漏。下劃線可以防止你犯這個錯誤。

+2

它真的使用蘋果?無論如何,Apple不會使用這個約定。它在「可可編碼指南」中未提及,也未在Apple自己的代碼中使用,例如:http://developer.apple.com/library/mac/#samplecode/TreeView/Listings/TreeViewDemo_View_TreeView_h.html#//apple_ref/doc/ uid/DTS40010131-TreeViewDemo_View_TreeView_h-DontLinkElementID_19 下劃線不會阻止您在使用屬性的情況下使用實例變量的錯誤。 – LearnCocos2D 2011-11-16 12:06:43

相關問題