2011-08-31 85 views
0

我試圖瞭解MT GC如何工作以避免使用(MonoTouch)MT的iOS應用程序中的內存泄漏。按照我的理解(糾正我,如果我錯了),MT內存管理以這種方式工作:每個對象都有一個標誌,上面寫着:「親愛的GC,現在我可以自由地隨時發佈」。當GC運行時,它會驗證該標誌並從內存中刪除該對象。因此,MT會將每個對象放在一個可能釋放對象的地方(可能是下一個事件循環)。這是一種自動釋放機制。但是也可以釋放一個調用其dispose方法的對象。在這種情況下,它意味着採用保留 - 釋放機制。Monotouch:垃圾回收器,託管和非託管對象

關於MT的閱讀,我已經看到有對象進入托管堆(例如對圖像的引用)以及其他進入非託管堆(例如圖像)的對象。在第一種情況下(管理人員),我不必擔心,GC運作良好。在第二個(非託管案例)中,我必須發佈內存明確性。爲什麼這個區別?你能解釋我如何區分託管與非託管對象,以及何時釋放內存調用處置方法?

預先感謝您。

+0

更多閱讀:http://stackoverflow.com/questions/2818315/iphone-no-garbage-collection-what-about-monotouch –

回答

1

你的描述不太對。花時間閱讀有關GC(不是GB ;-)和.NET的Microsoft文檔,然後閱讀關於Mono的current GC(和它的next版本 - 即使它尚未用於MonoTouch)。

一旦上面的內容清楚,當小型託管對象代表大型非託管對象時,會導致一些問題(但不會泄漏),您會看到常見問題。使用IDisposable可以解決這個問題,因爲它可以在對象完成時爲您提供更多控制。

詳細說明了documentation關於如何(以及何時)使用它。

+0

謝謝!你能解釋一下託管和非託管對象之間的區別嗎?我已經修復了GB錯誤。謝謝。 –

+1

GC僅適用於被管理對象。但是讓我們說我有一個字節[1000000]數組(管理),然後GC知道它是一個大對象(可以使用這種知識)。現在,如果我有一個IntPtr(託管)對象,指向1000000(非託管)字節,則GC只能知道它是4/8字節(32/64位)。這就是爲什麼您應該在處理IntPtr或非託管資源時實施(和/或使用)IDisposable。請注意,也可能存在與內存無關的問題(例如限制同時打開的文件句柄數,定時器...) – poupou

+0

謝謝!但是如何區分託管資源和非託管資源呢? IntPtr是一個指向XIB構造接口的指針。例如,非託管資源就是圖片。是不是真的? –