iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了内存泄漏 – Xamarin.iOS简单的NavigationController内存泄漏大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的项目中遇到了一个问题,并尝试创建一个示例项目来重现它,我能够.

https://bitbucket.org/theonlylawislove/xamarinnavigationcontrollermemoryleak

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

我正在使用XCode5和XaR_534_11845@arin.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(() => {

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

}

解决方法

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

如果您使用使用精确系统的SGen,您将看到物体立即消失.

大佬总结

以上是大佬教程为你收集整理的内存泄漏 – Xamarin.iOS简单的NavigationController内存泄漏全部内容,希望文章能够帮你解决内存泄漏 – Xamarin.iOS简单的NavigationController内存泄漏所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。