2011-11-18 25 views
1

當您執行發佈時,您不會立即刪除內存。我使用了this code,我可以在使用發行版之前和之後看到內存,並且它不會更改。好的,它會在一段時間後發佈。iOS中的自由內存如何?

但是,在啓動一個使用大量內存的庫之前,我可以做些什麼來釋放所有內存?或者我該如何立即釋放內存?

+3

我想你是誤會記憶是如何工作的。你的應用程序有一個爲它保留的內存池,當你釋放內存時,它會回到這個池中。如果你需要爲你的程序釋放內存,它應該立即可用。 – mydogisbox

+1

常駐大小可能只是整個頁面的準確性,因此不應視爲絕對指南。無論如何,你能否顯示你的代碼不能立即釋放內存?由於某種原因,相關對象可能只是在autorelease池中結束,例如因爲您在某個時間使用getter來獲取它,即使您隨後釋放了父級所有權對象。 – Tommy

+0

一個很好的比喻可能是,如果你使用的是一個工具,你可以完成設置並宣佈'我已經完成了這個'。在下一位用戶出現之前可能需要一兩分鐘,但這並不意味着它不可用。 – NJones

回答

4

內存管理是iOS中的一件大事,但在我的開發過程中,這些信息對我有很大的幫助。

「每個對象都有一個」保留計數「,它通過調用」保留「來增加,通過調用」釋放「來減少。一旦保留計數達到0,對象就被釋放並且內存可以用於別的東西。

您可以「自動釋放」的對象。這意味着保留計數不會立刻下降,但下一次的電流自動釋放池排出減少。

iOS應用程序有一個事件循環中的代碼運行。在事件循環的每次迭代之後,自動釋放池被排空。保留計數爲0的任何對象被釋放。

默認情況下,自動釋放對象由不以new,copy,mutableCopy,retain或init開頭的方法返回。這意味着你可以立即使用它們,但是如果你不保留它們,這個對象將會在運行循環的下一次迭代中消失。

如果您未能釋放保留的對象但不再引用它們,那麼您將有內存泄漏,這可以通過Instruments中的泄漏工具檢測到。

一種策略是自動釋放上述命名方法返回的所有內容,並將對象存儲在保留屬性(或字符串副本)中。在對象的dealloc方法中,將所有屬性設置爲零。將保留/複製屬性設置爲零可釋放當前指向的對象。只要您沒有任何循環引用(通過不爲代表的「父」對象使用保留屬性而避免),您將永遠不會遇到任何泄漏。「

此處是此信息的線程的鏈接

http://www.quora.com/What-is-the-best-way-to-understand-memory-management-in-iOS-development

這是一些有用的代碼示例一個很好的線索,以及其他的引用。

+0

我很喜歡它。謝謝。 – medampudi

1

發佈立刻釋放內存(假設它的最後一個版本)。這意味着,它可以通過使用您的分配時再次申請。 請注意,每一個應用程序有一些由系統分配的可用內存塊(頁面),並且在分配/取消分配頁面的一部分時,釋放的內存不會自動返回到系統。它只是被標記爲免費的,可以被應用程序再次使用。

要理解這一切,你需要了解一些有關操作系統如何處理內存分配,虛擬內存等