内存泄漏 – Xamarin.iOS简单的NavigationController内存泄漏

内存泄漏 – Xamarin.iOS简单的NavigationController内存泄漏,第1张

概述我在我的项目中遇到了一个问题,并尝试创建一个示例项目来重现它,我能够. https://bitbucket.org/theonlylawislove/xamarinnavigationcontrollermemoryleak 问题在于,当我呈现UINavigationController时,导航控制器或其根视图控制器永远不会被垃圾收集.它虽然在iOS模拟器中工作.为什么这种内存泄漏只发生在设备上? 我在我的项目中遇到了一个问题,并尝试创建一个示例项目来重现它,我能够.

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(() => {                        }));                    }));                });            }        }    }}
解决方法 这只是保守收集器的副作用,堆栈上可能有一些垃圾,但使用你的应用程序将消除垃圾并允许释放对象.

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

总结

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1040006.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存