我剛剛繼承了一個iOS項目,並且只是查詢了有關ivars和屬性的分配方式。聲明一個iVar屬性
在此項目中,ivars的名稱與該屬性相似,但以下劃線開頭。然後,當屬性正在合成它是這樣做的
@synthesize property = _ivar;
我覺得這有點奇怪。我剛纔在一個iOS項目上工作過,但是當我同時做這個伊娃和財產時,他們的名字都是一樣的。然後,我會簡單地綜合該屬性,一切都是h d。
這傢伙爲什麼要做不同的事情?我錯過了什麼?
我剛剛繼承了一個iOS項目,並且只是查詢了有關ivars和屬性的分配方式。聲明一個iVar屬性
在此項目中,ivars的名稱與該屬性相似,但以下劃線開頭。然後,當屬性正在合成它是這樣做的
@synthesize property = _ivar;
我覺得這有點奇怪。我剛纔在一個iOS項目上工作過,但是當我同時做這個伊娃和財產時,他們的名字都是一樣的。然後,我會簡單地綜合該屬性,一切都是h d。
這傢伙爲什麼要做不同的事情?我錯過了什麼?
沿着這條線的某個地方,當開發人員引用self.property
時,通常會使用_var
表單作爲防止意外引用變量的保護。現在已經確定,使用最新的工具,您可以完全刪除@synthesize
行,並自動模擬@synthesize x = _x;
。
你不會錯過任何東西,它是一種風格的選擇。當使用_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
併爲你創建伊娃。
這種做法強制您調用並設置您的iVars使用屬性。在你想使用iVar的地方,你用_iVar調用它,否則就沒有機會直接調用iVar而不使用屬性。它會顯示錯誤,你會得到提醒,哦,我需要把自己。
在XCode的最新版本中,您無需綜合,它可以爲您提供幫助。但是再次強調一下。
但是你可以通過聲明它@synthesize property=property;
或@synthesize property;
覆蓋它,甚至你會知道,你可以給任何其他名稱@synthesize property=myproperty;
但是最初它只是一個風格問題,比如使用變量名稱和動作名稱例如numberArray,nameTextField,cancelButton,但現在它很少使用,並且要求人們分別命名數字,名稱和取消。
但我會建議遵循蘋果準則使用_property。
好吧,現在我很困惑。這傢伙正在遵循這個公約。但是,在他的所有代碼中,他引用_ivar而不是self.property?這是不正確的? – conor
人們需要使用'_ivar'的主要地方是他們編寫自定義的「getter」。在這種情況下,你不能寫'self.property',因爲它是對同一個「getter」方法的遞歸調用。除此之外大部分用途,我會考慮可疑,直到我看到確切的背景。 –
那麼這取決於,如果你使用'_var',那麼KVO將不會被觸發,也許這是以前的開發人員想要的。 – rckoenes