2012-09-19 44 views
1

我的問題基本上是標題。在打開自動引用計數功能的XCode中,我是否需要手動管理內存?像調用發佈,保留等?隨着ARC將我需要手動管理內存?

謝謝!

+0

在ARC中,您不必擔心釋放內存。但請注意,在使用它時不會釋放對象。 –

+0

@Prince:對象何時被釋放? – Surfbutler

+0

@Surfbutler在未來的任意點。這將是確定性的,但不是從你的語法中明確的,除了你會隱含提供更高的生命週期邊界。所以像Guard Malloc和殭屍這樣的東西應該可靠地捕捉到問題並且性能應該是可預測的,但是編寫假定發佈將會發生的代碼是一個壞主意 - 儘管由於各種原因它總是一個壞主意。如果您需要明確告訴某人什麼時候停止某件事情,請按照'NSTimer'模式的'invalidate'類型步驟操作。 – Tommy

回答

5

ARC只處理Objective-C對象。所以你需要手動繼續管理Core Foundation和普通的C內存。

雖然您不需要手動保留或釋放,但您仍然負責防止保留週期 - 確保將適當的屬性標記爲強和弱。所以你需要繼續考慮所有權方面的問題。

除此之外,至少有一個非常具體的怪癖 - 如果堆棧要在它們下面放鬆,則需要記住複製塊。這是爲了確保它們最終堆在棧上,而不是堆棧,因此與內存管理相關。

+0

在某些情況下(例如將塊分配給屬性或從函數返回一個塊),塊將自動複製,但我不會依賴它。 –

+0

我認爲它們在被其他模塊捕獲時也被複制,因此它覆蓋了99%的實際用例,但我還沒有找到任何可引用的參考,例如,將一個作爲對象傳遞給'performSelector:... afterDelay:'將是安全的。 – Tommy

+0

不,只是任意將一個塊作爲一個對象傳遞給另一個函數是不「安全的」,讓我解釋一下爲什麼:當塊被傳遞到已經複製了對象(如屬性)的函數中時,會自動複製塊,但它們不是'保持像普通物體一樣。所以,雖然我可能有一個強烈的引用塊,除非這個塊在堆上,這意味着什麼。當分配給任意類型('id')時,塊不會被複制,因爲ARC不知道你想使用'copy'和'retain'(它只在塊已經被複制時才起作用)。塊很混亂。 –