【问题标题】:Xamarin.iOS simple NavigationController memory leakXamarin.iOS 简单 NavigationController 内存泄漏
【发布时间】:2013-11-09 22:48:36
【问题描述】:

我的项目有问题,我尝试创建一个示例项目来重现它,但我成功了。

https://bitbucket.org/theonlylawislove/xamarinnavigationcontrollermemoryleak

问题是,当我展示 UINavigationController 时,导航控制器或其根视图控制器永远不会被垃圾收集。它确实在 iOS 模拟器中工作。为什么这种内存泄漏只发生在设备上?如果您在设备上运行示例项目,您将永远不会在调用的解构器中看到 Console.WriteLine。

我正在使用 XCode5 和 Xamarin.iOS 7.0.4.171(商业版)

这是我用来演示泄漏的 AppDelegate。

[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
    UIWindow window;
    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        window = new UIWindow (UIScreen.MainScreen.Bounds);
        window.RootViewController = new UINavigationController(new RootController ());
        window.MakeKeyAndVisible ();

        return true;
    }

    class RootController : UIViewController
    {
        public RootController ()
        {
            NavigationItem.RightBarButtonItem = new UIBarButtonItem("Present", UIBarButtonItemStyle.Bordered, (o,e) => {
                PresentViewController(new NavigationController(), true, new NSAction(() => {}));
            });
        }
    }

    class NavigationController : UINavigationController
    {
        public NavigationController ()
            :base(new TestController())
        {

        }

        ~NavigationController()
        {
            Console.WriteLine("~NavigationController");
        }

        class TestController : UIViewController
        {
            ~TestController()
            {
                Console.WriteLine("~TestController");
            }

            public override void ViewDidAppear (bool animated)
            {
                base.ViewDidAppear (animated);
                Task.Factory.StartNew (() => {
                    Thread.Sleep(2000);
                    NSThread.MainThread.InvokeOnMainThread(new NSAction(() => {
                        DismissViewController(true, new NSAction(() => {

                        }));
                    }));
                });
            }
        }
    }

}

【问题讨论】:

  • 你能把代码的相关部分粘贴在这里吗?
  • 我添加了相关代码。

标签: memory-leaks xamarin.ios


【解决方案1】:

这只是保守收集器的副作用,堆栈上可能有一些垃圾,但使用您的应用程序将消除垃圾并允许释放对象。

如果您使用使用精确系统的 SGen,您将看到对象立即消失。

【讨论】:

  • SGen有什么优势?我应该在生产中使用它吗?
猜你喜欢
  • 1970-01-01
  • 2018-07-05
  • 2021-12-25
  • 1970-01-01
  • 2012-04-03
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多