C# UIViewController未被释放

C# UIViewController未被释放,c#,memory-leaks,xamarin.ios,xamarin,lifecycle,C#,Memory Leaks,Xamarin.ios,Xamarin,Lifecycle,我注意到我用Xamarin iOS 7.2.2编写的大型应用程序间歇性崩溃。Instruments告诉我,我的应用程序在内存使用量上有所增长,但没有真正下降 我已确保取消UIViewController中的所有事件,尽管如此,我的UIViewController不会被处置 我知道它们不会被处理,因为它们上的断点永远不会执行 示例性处置方法: protected override void Dispose(bool disposing) { _someViewControl

我注意到我用Xamarin iOS 7.2.2编写的大型应用程序间歇性崩溃。Instruments告诉我,我的应用程序在内存使用量上有所增长,但没有真正下降

我已确保取消UIViewController中的所有事件,尽管如此,我的UIViewController不会被处置

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

示例性处置方法:

    protected override void Dispose(bool disposing) {
        _someViewController = null;
        _otherView = null;
        ReleaseDesignerOutlets();
        base.Dispose(disposing);
    }
我并没有做任何花哨的事情,除了取消对其他视图的引用和发布designer Outlet,但它从未被调用


为什么在从导航控制器弹出“我的视图控制器”后不调用Dispose?

可能有某个对象仍保留对视图控制器的引用

在某些情况下,很难确定引用的内容。由于您使用的版本比您应该尝试的GC(Bohem或sgen)的新Refcount扩展版本更新


来自的信息(和链接)更多,但简而言之,此扩展将更好地跟踪本机对象生存期,并且它还删除了大多数支持字段(可能包含此类引用)

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

  • 不要将UIViewController和UIView保留在内存中,始终根据需要创建它们,并在不需要时显式地进行处置
  • 在dispose方法中,dispose“拥有”UIViewController和UIView的
  • 在dispose方法中,手动从父视图中删除并处置所有子视图
  • 在dispose方法中,取消对控制器和视图的所有引用
  • 在dispose方法中,使所有事件为空
  • 使用新的参照计数功能和新的GC(项目选项)
  • 如果使用Sqlite,请在启动时执行此操作
  • 根据Xamarin&iOS文档,即使这些步骤不是必需的,没有它们,我的应用程序也不会释放内存。现在它合理地收集,这表明跨越ObjC和mono运行时的复杂对象图之间的Xamarin GC没有被正确收集(可能是由于循环引用)。手动断开对象引用简化了对象引用图,允许GC比其他方式更快、更可靠地发生


    Xamarin应该认真研究这一点,复杂应用程序会出现间歇性崩溃和内存泄漏

    Refcount没有任何区别。那么引用可能由您自己的代码保存(不是备份字段或被其他东西延迟)。您可以使用HeapShot查找保存此引用的内容和/或提交错误报告@在这种情况下,请随说明附上您的代码或子集(复制它)。感谢您提供的提示,尽管在Google上搜索了很长一段时间,但仍不知道HeapShot。不幸的是,应用程序在monotouch_release_managed_ref进行可靠测试时会间歇性崩溃。这些崩溃似乎是在连接到调试器时发生的。使用工具,我成功地确认了内存释放,但我必须在任何地方尽可能多地手动处理视图,并在任何可能的地方手动清空事件处理程序和引用。似乎有些奏效了。我最大限度地利用c#闭包,一种可能导致复杂对象引用图的非方法/类型。升级后我也遇到了类似的问题
    Mono.Data.Sqlite.SqliteConnection.SetConfig(Mono.Data.Sqlite.SQLiteConfig.Serialized);