Memory management Xamarin Ios中的垃圾收集器无法在设备上运行

Memory management Xamarin Ios中的垃圾收集器无法在设备上运行,memory-management,memory-leaks,xamarin.ios,garbage-collection,Memory Management,Memory Leaks,Xamarin.ios,Garbage Collection,当我在emulator上运行xcode instruments和I profile时,我的UiViewControllers Dispose方法会在移除视图后立即被调用。但当我在设备上运行应用程序时,所有UiViewController的dispose方法都不会被调用!。或者调用速度很慢,内存太高 我不知道为什么会这样。问题是,在设备中,获取应用程序调用dipose方法的唯一方法是在AppDelagate ReceiveMemoryWarning和DidEnterBackground()中手动执

当我在emulator上运行xcode instruments和I profile时,我的UiViewControllers Dispose方法会在移除视图后立即被调用。但当我在设备上运行应用程序时,所有UiViewController的dispose方法都不会被调用!。或者调用速度很慢,内存太高

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

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

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

正如您在emulator上看到的,每次删除UIviewcontroller时都会调用dispose方法。但是在设备中,从不调用dispose方法。当应用程序转到beckground,我手动调用GC.Collect()时,您会在设备的图像中看到下降

为什么不像在模拟器中那样,在ios设备上自动执行呢

我对xamarin很陌生,我花了4天的时间试图弄明白这一点。我真的不知道该怎么办


我希望有人能帮助我。

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

这主要是为了帮助您更快地发现代码中的bug(比如访问已经消失的托管引用)。所以,这就是为什么在部署到设备时,您不会像在模拟器上一样频繁地看到收集

您不应该太担心收集不会经常发生,GC启发式将确定何时发生,您确实需要“担心”的时间是在处理大型托管对象(如图像等)时。但是在using语句中创建这些对象就足够了