UIViewController不会被处置

本文关键字:UIViewController | 更新日期: 2023-09-27 18:04:27

我注意到我用Xamarin iOS 7.2.2编写的大型应用程序间歇性崩溃。仪器显示,我的应用程序的内存使用量在增长,而不是真正下降。

我已经确保无效的所有事件在我的UIViewControllers,尽管如此,我的UIViewControllers没有被处置。

我知道它们没有被处理,因为它们上的断点永远不会执行。

示例处理方法:

    protected override void Dispose(bool disposing) {
        _someViewController = null;
        _otherView = null;
        ReleaseDesignerOutlets();
        base.Dispose(disposing);
    }

除了取消对其他视图的引用和释放设计器出口外,我没有在它们中做任何花哨的事情,但它从未被调用过。

为什么处置不被调用后,我的视图控制器从导航控制器弹出?

UIViewController不会被处置

以下模式帮助最小化内存泄漏

  1. 不要保留UIViewController的&UIView在内存中,总是在需要的时候创建它们,不需要的时候显式地dispose。
  2. 在dispose方法中,dispose"owned"UIViewController &UIView
  3. 在dispose方法中,手动从父视图中移除并处置所有子视图
  4. 在dispose方法中,取消对控制器的所有引用&
  5. 在dispose方法中,取消所有事件
  6. 使用新的Refcount功能和新的GC(项目选项)
  7. 如果使用Sqlite,在启动时执行
Mono.Data.Sqlite.SqliteConnection.SetConfig(Mono.Data.Sqlite.SQLiteConfig.Serialized);

尽管根据Xamarin &iOS文档,没有它们,我的应用永远不会释放内存。现在它的收集是合理的,这表明Xamarin GC在跨越ObjC &未正确收集Mono运行时(可能是由于循环引用)。手动破坏对象引用简化了对象引用图,使GC发生得更快、更可靠。

Xamarin应该好好看看这个,间歇性崩溃&复杂的应用程序会发生内存泄漏。

可能有什么东西仍然持有对视图控制器的引用

在某些情况下,很难确定是什么保存了引用。由于您使用的是比7.2.1更新的版本,您应该尝试New Refcount扩展到GC (Bohem或sgen)。

发布说明中有更多的信息(和链接),但是,简而言之,这个扩展将更好地跟踪本机对象生命周期,并且它还删除了大多数支持字段(可以保存此类引用)。