gpt4 book ai didi

c# - 向后导航不会释放内存

转载 作者:太空宇宙 更新时间:2023-11-03 19:49:43 25 4
gpt4 key购买 nike

在我的应用程序中,使用 Xamarin Profiler 我注意到,每当我将 VC 推送到堆栈并返回时,内存分配都不是免费的。如果我再次推送相同的 View ,它会增加更多内存。

我创建了一个示例项目进行测试,我发现它做同样的事情。

示例项目:

我有两个 View Controller ,VC1 和 VC2。 VC1 是 Root View Controller 。

每当我从 VC1 推送 VC2 时,都会分配内存,但当我返回时,内存不是空闲的。如果我再次继续插入 VC2,它会增加更多内存。在 VC2 中,我通过设计器添加了 3 个标签。

在 AppDelegate 中:

namespace TestSample
{
[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
public override UIWindow Window
{
get;
set;
}

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
Window = new UIWindow(UIScreen.MainScreen.Bounds);
var nav = new UINavigationController(new MyViewController());
Window.RootViewController = nav;
Window.MakeKeyAndVisible();

return true;
}
}
}

VC1:

namespace TestSample
{
public partial class MyViewController : UIViewController
{
public MyViewController() : base("MyViewController", null)
{
}

public override void ViewDidLoad()
{
base.ViewDidLoad();
// Perform any additional setup after loading the view, typically from a nib.
}
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);

btn1.TouchUpInside += Btn1_TouchUpInside;
}

void Btn1_TouchUpInside(object sender, EventArgs e)
{
NavigationController.PushViewController(new MyViewController2(), true);
}

public override void ViewDidDisappear(bool animated)
{
base.ViewDidDisappear(animated);
btn1.TouchUpInside -= Btn1_TouchUpInside;
}

public override void DidReceiveMemoryWarning()
{
base.DidReceiveMemoryWarning();
// Release any cached data, images, etc that aren't in use.
}
}
}

VC2:

namespace TestSample
{
public partial class MyViewController2 : UIViewController
{
public MyViewController2() : base("MyViewController2", null)
{
}

public override void ViewDidLoad()
{
base.ViewDidLoad();
// Perform any additional setup after loading the view, typically from a nib.
}

public override void DidReceiveMemoryWarning()
{
base.DidReceiveMemoryWarning();
// Release any cached data, images, etc that aren't in use.
}

public override void ViewDidDisappear(bool animated)
{
base.ViewDidDisappear(animated);
/*foreach (UIView view in View.Subviews) {
view.RemoveFromSuperview();
}*/

label1.RemoveFromSuperview();
label2.RemoveFromSuperview();
label3.RemoveFromSuperview();

label1.Dispose();
label2.Dispose();
label3.Dispose();
}
}
}

最佳答案

Xamarin.iOS 中的垃圾收集完全没有损坏。这是一个普遍的误解(在任何系统上!),认为拥有 GC 意味着人们不必再担心内存消耗和(强)引用。

X.iOS 位于引用计数世界之上,这需要进行某些测量。所有这些都记录在案;是的,可能很难理解所有的细微差别。

就是说:我尝试了您的示例,并且按预期收集了 VC2(调用了 Finalizer 和 Dispose())。此外,探查器 (1.0.2-2) 没有显示任何泄漏。

我创建了两个基于 XIB 的 Controller ,并为第一个添加了一个按钮,为第二个添加了三个标签。您不必删除或处置任何标签,也不必取消订阅您案例中第一个 VC 中的点击事件。

如果您的项目表现不同,您就是在某处保留了对 VC2 的引用。或许你可以提供完整的工程,我可以看看。

关于c# - 向后导航不会释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41232003/

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