2012-01-05 45 views
1

我有我的自定義的UIViewController成員變量被定義爲「分配」是這樣的(不是「保留」):是更好的做法是使成員乏保留與分配

@property (nonatomic, assign) UIButton* mSkipButton; 

在我的loadView方法,我將var(例如self.mSkipButton)設置爲變量類型的自動釋放分配。然後我將它附加到我的控制器的視圖中,實質上具有視圖引用計數並根據需要釋放它。

然而,這涉及到我將指針存儲在我的成員var中,並且如果計數在某個點遞減,它可能引用釋放的內存。是不是更好的做法,而是將變量聲明爲'retain',然後在viewDidUnload方法中釋放成員var(或者只是將它設置爲零來釋放並確保我沒有地址)?

或者,我可以簡單地將viewDidUnload中的member var設置爲nil,而不是將其設置爲保留變量?

+0

該對象是否被另一個超出視圖控制器的對象所保留?如果你能證明它被另一個項目(也許是應用程序委託)保留,那麼你可能會逃避不保留它。但最佳實踐表示,您應該始終保留併發布。 – Kekoa 2012-01-05 21:32:08

回答

2

是更好的做法,而不是變量聲明爲'保留',然後在viewDidUnload ...?

是的,使用retain - 良好的本能。在viewDidUnload,你通常只是它通過伊娃的setter設置爲nilself.ivar = nil;

我發現很容易做到心中有數,明確管理對象codependencies,而不是處理有關使用assign問題。您可以完全避免持有非託管引用的問題。

參數可以做出assign通常會被罰款這裏(它是在某些情況下),但使用assign可以爲任何人與類的工作複雜化的對象圖和所有權。隨着程序複雜性的增加(以及依賴於更改的庫),追蹤非託管引用的生命週期變得越來越困難。事情往往會打破,或者在不同的硬件和軟件組合上運行不同。嘗試通過複雜程序或併發上下文管理非託管對象的生命週期是自我濫用。保證定義和可預測的行爲/操作可減少錯誤數量。

2

這是一個屬性,而不是「構件VAR」(在Objective-C稱爲一個實例變量或的ivar。)

一個屬性的語義取決於該屬性將如何被使用。一般來說,你會希望你的屬性在你的對象的一生中保留。如果該物業是一個連接的IBOutlet,這將由NIB裝載機爲您完成;否則,您必須明確並使用屬性上的retaincopy屬性。

對於預期擁有您的對象的對象,屬性應始終標記爲assign以避免保留循環。例如,對象通常爲擁有它作爲一個委託任何對象(通常,但並不總是 --every CS規則都有例外。)

相關問題