2012-08-02 121 views
0

我有一個在我的UIViewController中使用的NSArray對象。我可以聲明它是一個ivar或作爲一個財產。這兩種方法有什麼優勢(考慮到我正在使用ARC)?ARC:成員變量和屬性之間有什麼區別?

選項1:

@interface MyViewController { 
    NSArray *_myArray; 
} 
@end 

選項2:

@interface MyViewController 
    @property (strong, nonatomic) NSArray *myArray; 
@end 

回答

1

屬性和實例變量是概念上完全不同。

A 屬性表示您的代碼的邏輯組件。它可能,但不一定是由伊娃支持的。這可能是在運行時計算 動態生成 (像一個視圖的-frame)等

一種的ivar是保持某些數據的存儲器的實際分配的塊。

如果您使用屬性(正確),您將獲得很好的功能,如開箱即用的KVC/KVO合規性。由於這個原因和其他原因,人們經常認爲這是一種很好的做法,尤其是在現代運行時期,以屬性的形式聲明所有公共接口,並在適當情況下使用ivars(經常使用@synthesize)對其進行內部備份。

就我個人而言,我更喜歡使用私有數據的屬性,這樣既可以讓我更容易在稍後公佈,也可以輕鬆地提供屬性的自定義實現(和setter/mutators),而不是依靠一個簡單的伊娃。

既然你提到ARC,我還沒有使用太多(但),但我不認爲它應該有很大的區別,只要你聲明你的屬性是正確的。

+0

我的問題是專門爲私人數據。感謝您的解釋。 – melsam 2012-08-02 23:12:05

+0

就ARC而言,屬性和iVar在大多數情況下都會消除它們之間的差異。以前,您必須確保將變量設置爲屬性,因爲它們存在未被正確保留的風險。現在,在ARC中, – 2012-08-02 23:12:09

+0

我從來沒有聽說過沒有與它有關的ivar的屬性,使用@dynamic僅僅意味着訪問者將在代碼的稍後某處提供,所以編譯器不必爲你找到它們。除非你的意思是讓這些訪問器執行其他不向ivars釋放的東西,在這種情況下,我認爲它會破壞目的。 – Pochi 2012-08-02 23:16:32

相關問題