2012-06-21 57 views
5

我有一個關於ARC在iOS中的快速問題。 (對不起,我問過這麼多類型的問題,但對於內存管理我只是很困惑)。請注意,我從來沒有使用舊的內存維護系統(retainrelease,assign ...等),所以我不太清楚這些術語的含義。強大的屬性何時在iOS中的ARC中發佈?

現在我很困惑我必須做些什麼才能確保強大的屬性得到正確釋放。例如,假設我正在創建一個學校應用程序,並且我的School對象包含對5個不同Child對象(不在數組中)的強屬性引用。每個Child對象都有一個指向Book對象的強指針(屬性)。

如果我從我的學校刪除其中一個Child對象(比如說將其屬性設爲nil,或者將屬性改爲指向一個新對象),它的Book會被正確釋放嗎?我需要做些什麼來確保這種情況?我是否需要在dealloc方法中編寫self.myBook = nil?如果Child是一個視圖控制器,我需要在viewDidUnload方法中編寫self.myBook = nil

我只針對iOS 5(及以上),所以舊的內存管理方式對我來說並不重要。

+0

我建議您閱讀以下內容:http://clang.llvm.org/docs/AutomaticReferenceCounting.html –

+0

感謝您的建議。我會看看它。 – Nosrettap

回答

5

如果我從學校取出Child對象之一(比如說通過使其property = nil,或者改變我的財產,在一個新的對象指向),將其Book正確釋放?

是的,只要沒有其他強烈的引用,它就會被釋放。

我該怎麼做才能確保這種情況?

沒什麼特別的:ARC將遞減對象的引用計數當您將引用該對象nil,看到該對象不再被引用,並繼續將其刪除。它足夠聰明,可以遞歸地處理從被刪除對象引用的項目,所以你不會泄漏任何內存。你不必擔心

一件事是循環引用:如果您Book具有很強的向後引用Child,要麼使該引用weak,或將其清除出去,同時爲您設置的Booknil參考(第二種選擇容易出錯,因此不推薦)。

+0

那麼你會說,大多數情況下,使用「弱性質」的唯一時間是針對網點並避免循環依賴? – Nosrettap

+0

@Nosrettap避免循環引用,在某種程度上,緩存是涵蓋使用弱屬性的兩個「傘形案例」。一個值得單獨值得提及的重要特例是代表委託的屬性:除了'CAAnimation'這個明顯的例外,所有委託屬性都很弱以避免創建保留週期。 – dasblinkenlight

+0

如果有一個引用循環,他不能在-dealloc中清除它,因爲dealloc永遠不會被調用!(除非它是擁有這兩個循環成員的方法的dealloc) –