2011-08-31 48 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构造接口的指针。例如,非托管资源就是图片。是不是真的? –