gpt4 book ai didi

memory-leaks - Xamarin.iOS 简单 NavigationController 内存泄漏

转载 作者:行者123 更新时间:2023-12-04 04:11:40 26 4
gpt4 key购买 nike

我在我的项目中遇到了一个问题,并试图创建一个示例项目来重现它,我能够做到。

https://bitbucket.org/theonlylawislove/xamarinnavigationcontrollermemoryleak

问题是,当我呈现 UINavigationController 时,导航 Controller 或其根 View Controller 永远不会被垃圾收集。不过,它确实可以在 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,您将立即看到对象消失。

关于memory-leaks - Xamarin.iOS 简单 NavigationController 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19884086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com