2013-02-28 28 views
0

對不起那種無用的帖子標題,但由於我不確定我在做什麼,這是我能想到的最好的。爲什麼我要聲明屬性兩次?還是我?

在我的頭文件,它看起來像這樣

@interface RootViewController : UITableViewController { 
NSMutableArray *eventsArray;  
} 

@property (nonatomic, retain) NSMutableArray *eventsArray; 

@end 

這是不是所有的屬性,但我刪除所有,但一個爲簡單起見。

我按照蘋果開發者的指導來做這件事。看起來好像這個指南並沒有完全更新,因爲它告訴我綜合屬性,我不應該再糾正了嗎?

總之,爲什麼會這樣?對我來說,這是一個初學者,似乎我宣佈了財產兩次?還是我在那裏的第一排做別的事情?

回答

4

這是由於歷史原因,與舊的編譯器。

你可以做到這一點現在:

@interface RootViewController : UITableViewController 

@property (nonatomic, retain) NSMutableArray *eventsArray; 

@end 

你擁有它,您聲明實例屬性,然後你說你想自動生成getter和setter的方式。

如今,你可以說你有一個屬性,編譯器會在編譯時自動生成實例屬性。它消除了明顯的冗餘。

+0

你可能想指出一個實例變量和一個屬性是兩個完全不同的東西。聲明的屬性是一種抽象,表示可能或可能不依賴底層實例變量進行存儲的訪問器方法或方法對。 – jlehr 2013-02-28 16:38:44

2

對我來說,這是一個初學者,好像我宣佈 屬性兩次?還是我在那裏的第一排做別的事情?

一個屬性和支持它的實例變量(如果有的話)是兩個不同的東西。一個屬性實際上只是這個類提供了某些訪問方法的承諾。所以你必須單獨申報財產和伊娃並不奇怪。然而,實際上,大多數物業都由一個有相關名稱的伊娃支持,並且分別編寫和維護這兩個物品是一件苦差事。因此,Apple向編譯器添加了ivar綜合,以便編譯器爲任何已經不存在ivar的合成屬性生成ivar。此外,由於合成訪問器是最常見的,因爲編譯器將使用您提供的任何訪問器,即使屬性標記爲@synthesize,該屬性也會成爲默認值,因此不再需要編譯器指令。

相關問題