Xamarin Ios中的垃圾收集器不能在设备上运行

时间:2017-07-01 07:20:35

标签: memory-management memory-leaks xamarin.ios garbage-collection

当我在模拟器上运行xcode乐器和配置文件时,在删除视图后立即调用我的UiViewControllers Dispose方法。但是当我在设备上运行应用程序时,所有UiViewController的dispose方法永远不会被调用!或者被称为非常慢,内存太高。

我不知道为什么会这样。问题是,在设备中调用dipose方法的唯一方法是在AppDelagate ReceiveMemoryWarning和DidEnterBackground()中手动执行Gc.Collect()。当这些方法中的任何一个执行时,内存从140MB +降至70MB。

这是应用程序在模拟器上运行时的内存映像。 Emulator Memory Allocation

当我在设备上运行应用程序时。 Device Memory Allocations

正如您在模拟器上看到的,每次移除UIviewcontroller时都会调用dispose方法。但是在设备中,从不调用dispose方法。您在设备图像中看到的丢弃是当应用程序进入beckground并且我手动调用GC.Collect()时。

为什么不在ios设备中自动执行此操作,就像在模拟器中一样?

我是xamarin的新手,我花了4天的时间试图解决这个问题。我真的不知道该怎么做。

我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

在模拟器上以调试模式运行Xamarin.iOS时,每隔几秒就会有一个连续调用GC.Collect()的线程,因此垃圾收集的发生频率比实际设备更频繁。

这主要是为了帮助您更快地找到代码中的错误(比如访问已经消失的托管引用)。所以这就是你没有看到集合在部署到设备时在模拟器上发生的频繁发生的原因。

你不应该过于担心不经常发生的收藏,GC启发式方法将决定它何时应该发生,你确实需要担心的时间"担心"当您使用像图像等大型托管对象时,但在using语句中创建这些对象应该就足够了。