Monotouch:垃圾收集器,托管和非托管对象

时间:2011-08-31 08:26:14

标签: garbage-collection xamarin.ios unmanaged managed

我正在尝试了解MT GC如何使用(MonoTouch)MT来避免iOS应用中的内存泄漏。

正如我所理解的(如果我错了,请纠正我),MT内存管理以这种方式工作:每个对象都有一个标志,上面写着:“亲爱的GC,现在我随时可以随意发布”。 GC运行时,它会验证该标志并从内存中删除该对象。因此,MT将每个对象放在一个不稳定的位置,其中的对象将被释放(可能是下一个事件周期)。这是一种自动翻译机制。但也有可能释放一个调用其dispose方法的对象。在这种情况下,它意味着采用保留释放机制。

关于MT,我已经看到有些对象进入托管堆(例如对图像的引用)和其他进入非托管堆的对象(例如图像)。在第一种情况下(管理的)我不必担心它,GC运作良好。在第二个(非托管案例)中,我必须释放内存明确。为何如此区别?你能解释一下我如何区分托管和非托管对象以及何时释放显式内存调用dispose方法?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的描述不太对。花点时间阅读有关 GC (不是GB ;-)和.NET的Microsoft文档,然后阅读Mono的current GC(以及它的next版本 - 即使它尚未用于MonoTouch)。

一旦上述内容清楚,当一个小的托管对象代表一个大的非托管对象时,它会导致一些问题(但不会泄漏),你会看到常见的问题。使用IDisposable可以解决这个问题,因为它可以在对象最终确定时为您提供更多控制。

有关如何(以及何时)使用此内容的详细信息documentation