2011-04-09 95 views
6

可能重複:
What describes @property(…) best? What's that actually good for?爲什麼我應該使用@properties?

如果我宣佈我的類接口的變量,我可以在任何地方對我的類使用這些變量。真棒。

如果我使用@property (retain) Something *myVar;我可以通過self.myVar訪問該變量...但是,有什麼區別?有沒有很好的理由我應該使用這種或那種方法?

+0

我相信它與你是否想要創建getter/setter方法有關,但不要在此引用我。這是可可老兵之間的常識,我敢肯定有人會很快回答這個問題:) – 2011-04-09 04:59:50

回答

5

簡答:內存管理封裝。

較長的回答:如果您想稍後使用,則需要建立對象的所有權。如果你想稍後使用它,你需要一個引用它來做到這一點,並且保持引用的一個好地方是在一個實例變量中。

可能每次您爲所有權分配一個新的值(即保留和釋放),但會留下許多重複且麻煩的樣板代碼,如櫻桃在一個水果蛋糕。當(不是如果)出現錯誤時,這種混亂很難進行調試。因此,將代碼包裝在訪問器方法中會更好,因此您可以編寫一次,然後將其忘掉。

但是accessor方法也大多是樣板文件,所以我們使用@property聲明來自動創建它們,而不是手工編寫它們。

編輯:蘋果的Memory Management Guide提供了詳細的關於什麼用@財產所產生的存取方法做幕後很多

+0

因此,我提到的第一種方法如果一個對象沒有建立所有權,因此我可能在將來失去它?我想我只會使用一切= =的屬性。最後一件事:如果我在Dealloc方法中使用self.myProperty = nil(當我不再需要它時),我很好,對吧?我不必說[self.myProperty發佈]或任何東西? – Voldemort 2011-04-09 05:10:19

+0

不,通過使用+ alloc,-copy或-mutableCopy創建一個對象,或者通過發送一個-retain消息來建立所有權。不管你如何建立所有權,你必須通過發送一條消息來放棄它。還有一點就是 - 每次你給實例變量賦一個新的值時,你需要釋放舊的值,並且你需要確保所有這些所有權聲明保持平衡。 – 2011-04-09 05:13:02

+0

通過避免建立所有權的創建方法,或者在必須使用它們時使用-autorelease,並簡單地讓屬性分配處理其餘部分,這是最容易的。 – 2011-04-09 05:14:31

0

使用@property來訪問你的ivars,會爲你釋放和保留許多對象的重複代碼。你不必使用它們。這只是很多教程使得對於新平臺的人來說很簡單。

1

如果我使用@property(retain)Something * myVar;我可以通過self.myVar訪問這個變量......但是,有什麼區別?

@property (retain) Something *myVar; 

// this property declaration declares: 
- (Something *)myVar; 
// and 
- (void)setMyIvar:(Something *)arg; 
// and is accessible by dot syntax. 
// it also declares and/or documents how the ivar is managed (copy, retain, etc.) 
使用

// direct access to the ivar. zero additional overhead (with regard to accessing the ivar) 
[myVar message]; 

// properties used with dot syntax invoke the accessor. therefore, 
[self.myVar message]; 
// is the same as: 
[[self myVar] message]; 

屬性的特性也給了編譯器指令是如何合成的存取器。

有沒有很好的理由我應該使用一種方法?

在init和dealloc中,直接訪問ivar - 您對對象的ivars進行初始化和清理並且不關心子類。在這裏使用屬性也可以引入錯誤或未定義的行爲。

對於其他情況,也就是說,當對象處於完全構建狀態時,應始終使用訪問器以保持一致性。如果一個子類覆蓋訪問者,則直接訪問該ivar可能會破壞設計。

如果您想避免這種情況,那麼請將ivar設爲私有,並且不要爲其聲明屬性。如果你確實爲它聲明瞭一個屬性,那麼記錄它是私有的;在這種情況下,我通常會寫@property (retain) Something * private_myIvar;。在這種情況下,使用屬性來合成伊娃的內存管理是很方便的。

當ivar是私人的時候,您可以完全訪問它。直接訪問或私有財產是安全的。否則,假定您必須使用訪問器。

如果myIvar聲明爲私有,並且僅在初始化時創建,則可以避免完全聲明屬性。這將減少運行時間開銷(如果這很關鍵)。消息開銷,保留/釋放週期以及原子(自然)需要更多的執行時間。所以它可以繞過來提高性能。

能見度/維護。有時候,從界面上隱藏伊娃的維護/實施遠遠不夠。在其他情況下,ivar是類的實現細節,不應該是公共接口的一部分。在這種情況下,考慮將其設置爲私有的(有幾種方法可以在objc中使用這個方法)。

相關問題