【问题标题】:Xamarin memory profiler object growth understandingXamarin 内存分析器对象增长理解
【发布时间】:2015-10-10 21:52:46
【问题描述】:

我有一个大型 Xamarin iOS 应用程序正在遭受随机崩溃 - 我认为这是由于内存问题。在尝试解决问题之前,我试图确保我完全了解如何正确处理所有内容,因此我创建了一个非常简单的示例应用程序,其中包含 UINavigationController 和 2 个屏幕:

我的想法是使用分析器检查我在使用后是否正确清除了所有内容,所以我:

  1. 使用分析器运行我的应用程序
  2. 加载所有内容后创建快照。 (奇怪的是我要点击3次才对象增长为0)
  3. 单击“显示下一个屏幕”按钮并拍摄快照 4。
  4. 单击“返回”按钮,然后拍摄快照 5。

我的目标是让 5 抵消 4,这样我就知道一切都被正确处理了。然而,它实际上创造了另外 369 个对象,而不是对象增长是一个负数:

我在 Screen2ViewController 中创建了一个 dispose 方法,我认为它可以解决问题:

public partial class Screen2ViewController : UIViewController
    {
        public override void ViewDidDisappear (bool animated)
        {
            base.ViewDidDisappear (animated);

            this.Dispose ();
        }
        public Screen2ViewController (IntPtr handle) : base (handle)
        {
        }

        partial void GoBackButton_TouchUpInside (NSObject sender)
        {
            this.NavigationController.PopViewController(true);
        }

        protected override void Dispose (bool disposing)
        {
            this.ReleaseDesignerOutlets ();
            this.View.Dispose ();
            base.Dispose (disposing);
        }
    }

我是否误解了通过打开然后关闭一个新屏幕我应该期望净对象增长为 0 的事实?如果不是,那么我做错了什么以致无法正确发布所有内容?

我应该手动调用this.ReleaseDesignerOutlets() 还是自动调用?我确实在它上面设置了一个断点,但它似乎从未被调用,因此将它添加到我的 Dispose 方法中。

【问题讨论】:

    标签: c# ios memory-management xamarin xamarin.ios


    【解决方案1】:

    SO post 是对内存泄漏位置的一个很好的介绍。

    一般来说,我们可以说每个视图都需要从超级视图中移除、处置和归零。每个引用都需要被破坏,因此不存在循环引用。而且,即便如此,这也不是最佳做法,但有时致电 GC.Collect() 确实很有帮助。

    还不错的读物是:

    【讨论】:

      【解决方案2】:

      关键是确定哪些对象在快照之间保持活动状态,您应该打开那个以了解发生了什么。

      有许多延迟缓存和延迟初始化过程会触发一次,并且会在您的应用程序的整个生命周期内保留对象。所以第一步是确定哪些物体被保留在周围,然后确定是什么让它们保留在周围。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-10
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 2021-07-09
        • 2020-07-31
        • 2010-09-11
        • 1970-01-01
        相关资源
        最近更新 更多