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