我有一个简单的UIPageViewController
,其中有30页,每个页面都有一个UIImageView
(附带UIImage
,其中加载了UIImage.FromFile(..)
)。我确保一旦用户在页面中向前导航,就不会引用内存中的任何页面(或UIPageViewDataSource
)。
我看到的是,当用户向前导航时,会为每个页面的Dispose(bool)
和UIViewController
内的UIImageView
调用析构函数和IDisposable
方法。页面(如预期的那样)。但是,当我在连接到Instruments的硬件上运行此测试时,即使正在调用IDisposable
方法,也不会回收内存。经过一定的阈值"活字节"到了,然后回收了被垃圾收集的页面占用的大量内存:
为什么我没有看到内存被立即回收(即调用{{1}}方法时)?
答案 0 :(得分:1)
这有几个原因(参见New Dispose Semantics文档)。
它们主要与您(应用程序)完成对象的托管实例时调用Dispose
有关。
然而,这并不意味着iOS本身完成了原生对象,它很可能会尝试回调托管代码(例如子类,事件)。除非您非常了解所涉及对象的生命周期(并且任何错误都会导致崩溃),否则这不容易预测。
请注意,即使在此更改之前(在6.0.8中),Dispose
可以释放的唯一内容是托管实例内存 - 对于大多数对象而言,与其本机大小对应内容相比非常小。