我正在编写的应用程序需要支持 iOS5+。最近,Apple 过时ViewDidUnload
了,因为我们被告知在发布内存警告视图时没有显着的内存增益。
在我的应用程序中,我有一个UIViewController
管理非常重的UIWebView
.
此视图控制器以模态方式呈现,因此经常被创建和关闭。
通过使用 Instruments,我发现它所占用的内存UIWebView
在其控制器被解除后并没有立即被释放。
我假设控制器最终会被 Mono GC 收集,它会调用Dispose
控制器及其视图,这将处理UIWebView
和释放底层的原生对象。
我无法测试是否是这种情况:不幸的是,在展示和关闭控制器大约十次后,我收到内存警告,应用程序在下一秒崩溃。我不确定 Mono GC 是否有机会运行。
所以我所做的是GC.Collect
在控制器被解雇后立即添加呼叫。
我还必须添加ReleaseDesignerOutlets
.ViewDidDisappear
这似乎是免费UIWebView
的。
更新:我已经发现
ReleaseDesignerOutlets
调用ViewDidDisappear
显然是在释放 web 视图,但是 GC 调用没有任何好处。事实上,GC 从未收集过我的控制器,因为按钮单击处理程序使整个控制器保持活动状态。
现在,我完全迷失在某种 Cargo 内存管理中。
- 在我的情况下强制垃圾收集是否合理?
- 为什么我必须打电话
ReleaseDesignerOutlets
?当然,如果没有对“死”控制器的引用,它的视图也应该被认为有资格被收集? - 从 Instruments 的 heapshot diff 来看,看起来从代码“等待”到控制器创建的视图也是如此。我必须处理它们吗?取消他们?
- 我需要手动调用
Dispose
刚刚解散的控制器吗? - 我需要在我的控制器
ReleaseDesignerOutlets
的方法中包含调用吗?Dispose
UIView
我是否需要在我的自定义子类中取消对子视图的引用Dispose
?