2011-10-12 19 views
1

當你聲明一個@property@synthesize時,使用它是一個好習慣:Objective-C:Xcode自動識別'= _property':這是@synthesize創建的變量名嗎?

@synthesize myProperty = _myProperty; 

我注意到Xcode會爲你自動完成ivar名稱_myProperty,即使它尚未用於源代碼。

這是因爲ivar @synthesize會自動創建默認名稱_myProperty嗎?或者僅僅因爲Xcode支持這種常見約定併爲其自動完成?

謝謝。

編輯:我不是在尋找爲什麼這是一個好習慣的原因;我已經意識到這些並且已經使用了這個約定了一段時間。我想了解內部,因此我想問這是否是一個硬編碼的自動完成規則來滿足約定,或者它是否是標準的自動完成,實際上Objective-C規範要求@synthesize生成的ivar必須具有形式爲_myProperty,因此在ivar的幕後生成之後,自動完成意識到它的存在。謝謝!

回答

2

我認爲autocompletion是一個IDE的便利,而不是運行時的結果。我給這邏輯是,下面似乎是有效的:

@interface SomeClass() 
@property (nonatomic, assign) int unpublishedInstanceVariable; 
@end 

@implementation SomeClass 
@synthesize unpublishedInstanceVariable; 

- (void)someMethod 
{ 
    unpublishedInstanceVariable = 3; // not calling the setter 
} 
@end 
+0

不錯的湯米,好Sherlock'ing :)非常感謝。 – KomodoDave

1

硬編碼自動完成的規則​​來滿足約定

如果沒有明確指定伊娃的名字,它會被稱爲myProperty。自動完成與編譯器沒有任何關係,它只是Xcode的幫助。

+0

@synthesize爲您編譯一個ivar作爲預編譯步驟,這就是爲什麼我要檢查。謝謝。 – KomodoDave

+0

編譯器是爲你合成iVar的,這就是我提到它的原因。當然,你沒有明確*提及編譯器。 – kubi

+0

所以這是實際的編譯,而不是預處理步驟? – KomodoDave

1

作爲Xcode的4.4的,有一個新的轉折的尾部(原文如此)。

  • 我們現在被允許完全跳過@synthesize。在這種情況下,編譯器自動爲我們生成@synthesize foo = _foo;聲明,實例變量名稱前面帶有下劃線。

@interface Foo : NSObject 
@property (nonatomic, copy) NSString *foo; 
@end 

@implementation Foo 
- (void)bar { 
    NSLog(@"%@", _foo); // this Works! 
} 
@end 
  • 然而,如果我們有一個明確的@synthesize語句,但不指定實例變量的名稱,則實例變量的默認名稱是一樣的的財產,即沒有下劃線的前綴,在這種情況下@湯米的答案仍然成立。

如果有人能指出正式的Apple Docs鏈接來記錄這種行爲,那將會很棒。

更新

我的研究結果是斑上。這種行爲(@synthesize是默認值,並且在沒有明確合成的情況下創建後綴下劃線前綴實例變量等)在WWDC 2012 Session 405 - Modern Objective-C中公開宣佈。

+0

你的意思是'故事'。這是另一個IDE的便利,還是最新的Objective-C版本的功能? – KomodoDave

+0

@KomodoDave LLVM這樣做,所以我將其稱爲Objective-C功能(http://useyourloaf.com/blog/2012/08/01/property-synthesis-with-xcode-4-dot-4.html ) – Manav

+0

感謝您的澄清。 – KomodoDave

0

WRT你的問題的這部分:

是否......其實Objective-C的 規範要求,由@synthesize生成的伊娃必須 形式_myProperty,

你可以給你的ivar命名你想要的任何東西。從該文檔:

可以使用表格屬性=的ivar到指示特定 實例變量應該被用於屬性,例如:

@synthesize firstName, lastName, age=yearsOld; 

這指定firstName,lastName和age的訪問方法應合成爲 ,並且屬性年齡由實例 變量yearsOld表示。

此外,

的@synthesize指令還合成一個適當的實例變量,如果它是沒有其他聲明