Xamarin.iOS:对象处理但内存不回收

时间:2014-06-10 18:38:10

标签: ios xamarin.ios xamarin

我有一个简单的UIPageViewController,其中有30页,每个页面都有一个UIImageView(附带UIImage,其中加载了UIImage.FromFile(..))。我确保一旦用户在页面中向前导航,就不会引用内存中的任何页面(或UIPageViewDataSource)。

我看到的是,当用户向前导航时,会为每个页面的Dispose(bool)UIViewController内的UIImageView调用析构函数和IDisposable方法。页面(如预期的那样)。但是,当我在连接到Instruments的硬件上运行此测试时,即使正在调用IDisposable方法,也不会回收内存。经过一定的阈值"活字节"到了,然后回收了被垃圾收集的页面占用的大量内存:

Instruments screenshot illustrating the problem

为什么我没有看到内存被立即回收(即调用{{1}}方法时)?

1 个答案:

答案 0 :(得分:1)

这有几个原因(参见New Dispose Semantics文档)。

它们主要与您(应用程序)完成对象的托管实例时调用Dispose有关。

然而,这并不意味着iOS本身完成了原生对象,它很可能会尝试回调托管代码(例如子类,事件)。除非您非常了解所涉及对象的生命周期(并且任何错误都会导致崩溃),否则这不容易预测。

请注意,即使在此更改之前(在6.0.8中),Dispose可以释放的唯一内容是托管实例内存 - 对于大多数对象而言,与其本机大小对应内容相比非常小。