2012-12-05 160 views
0

我剛剛繼承了一個iOS項目,並且只是查詢了有關ivars和屬性的分配方式。聲明一個iVar屬性

在此項目中,ivars的名稱與該屬性相似,但以下劃線開頭。然後,當屬性正在合成它是這樣做的

@synthesize property = _ivar; 

我覺得這有點奇怪。我剛纔在一個iOS項目上工作過,但是當我同時做這個伊娃和財產時,他們的名字都是一樣的。然後,我會簡單地綜合該屬性,一切都是h d。

這傢伙爲什麼要做不同的事情?我錯過了什麼?

回答

1

沿着這條線的某個地方,當開發人員引用self.property時,通常會使用_var表單作爲防止意外引用變量的保護。現在已經確定,使用最新的工具,您可以完全刪除@synthesize行,並自動模擬@synthesize x = _x;

+0

好吧,現在我很困惑。這傢伙正在遵循這個公約。但是,在他的所有代碼中,他引用_ivar而不是self.property?這是不正確的? – conor

+1

人們需要使用'_ivar'的主要地方是他們編寫自定義的「getter」。在這種情況下,你不能寫'self.property',因爲它是對同一個「getter」方法的遞歸調用。除此之外大部分用途,我會考慮可疑,直到我看到確切的背景。 –

+0

那麼這取決於,如果你使用'_var',那麼KVO將不會被觸發,也許這是以前的開發人員想要的。 – rckoenes

0

你不會錯過任何東西,它是一種風格的選擇。當使用_ivar的方式,你不能輕易地與ivar或財產犯錯誤。同樣如Mike Weller所述,這是Apple建議的。

如果在使用委託時他們將與您的伊娃相同名稱的發送傳遞給他們,也會有所幫助。例如:

如果你聲明屬性tableView並做伊娃一樣,那麼編譯器會抱怨的方法重新聲明變量tableView,如:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Dot some thing with the table object 
} 

因爲無論是類範圍和方法範圍含有變量名稱tableView,您無法確切知道要使用哪一個。

在Xcode中的最新版本中,你甚至不必申報伊娃的更多,如果你頭文件看起來是這樣的:

@interface MyTableViewController : UIViewController <UITableViewDelegate> 
    @property (nonatomic, weak) IBOutlet UITableView *tableView; 
@end 

然後,你甚至不用到@synthesize該財產的任何更,這是爲你自動完成的,並且還會創建名稱爲_tableView的伊娃。但首選使用self.tableView語法通過屬性訪問變量。

這裏有一個例外,如果您在哪裏重新引入超級通話中已存在的房產,您必須致電@synthesize。它會再次爲您創建'_ivar'。

另一個例外是,如果您使用的是原始類型,編譯器將不會爲您創建 _ivar。你不需要在標題中創建它們,你只需要做 @synthesize myInt = _myInt併爲你創建伊娃。

+1

請注意,Apple現在建議您使用下劃線前綴(請參閱WWDC 2012視頻) –

+0

有趣的是,我習慣於反面。所有參數都以下劃線開頭。 : -/ – conor

+0

@conor違背了普通的Apple指南,但你可以隨意使用你喜歡的任何東西。 – rckoenes

0

這種做法強制您調用並設置您的iVars使用屬性。在你想使用iVar的地方,你用_iVar調用它,否則就沒有機會直接調用iVar而不使用屬性。它會顯示錯誤,你會得到提醒,哦,我需要把自己。

0

在XCode的最新版本中,您無需綜合,它可以爲您提供幫助。但是再次強調一下。

但是你可以通過聲明它@synthesize property=property;@synthesize property;覆蓋它,甚至你會知道,你可以給任何其他名稱@synthesize property=myproperty;

但是最初它只是一個風格問題,比如使用變量名稱和動作名稱例如numberArray,nameTextField,cancelButton,但現在它很少使用,並且要求人們分別命名數字,名稱和取消。

但我會建議遵循蘋果準則使用_property。