gpt4 book ai didi

garbage-collection - UIView 事件和垃圾收集

转载 作者:行者123 更新时间:2023-12-01 06:46:23 24 4
gpt4 key购买 nike

我观察到一些会影响任何程序的内存消耗的东西,我想提出一些想法。

我用 UIViewController 和 UINavigationViewController 创建了一个非常简单的测试项目。我推我的 ViewController 然后我弹出它。 GC 完成它的工作并且我的 ViewController 被释放(调用析构函数)。但是,如果我创建了一个 UIButton 并且我注册了它的一个事件(例如:TouchInsideUp),那么我的 ViewController 不会被释放。我需要取消注册事件才能释放我的 ViewController。为确保这不是计时问题,我的测试应用程序有一个调用 GC.Collect() 的按钮。

我不明白的是,如果可以从任何线程的堆栈或静态变量访问对象,则该对象将保持事件状态。如果我的 ViewController 有资格进行垃圾回收,那么 UIButton 也将是。该事件不应导致 ViewController 保留在内存中,因为 GC 无法访问 UIButton。在我的例子中,ViewController 只被 NavigationController 使用,所以一旦它被弹出,它应该总是被收集。

在新的分析器(mono 2.10)的帮助下,我可能会找到一个合乎逻辑的答案,但现在,我很困惑。任何的想法?

已编辑 :这里有一些代码可以帮助理解我的情况。

我的测试 ViewController 非常简单

public class TestViewController : UIViewController{
~TestViewController(){ Console.WriteLine("Finalizer called"); }

public UIButton Button {get; set;}
public override ViewDidLoad(){
base.ViewDidLoad();

// If I remove the event registering, my TestViewController is collected.
Button = new UIButton();
Button.TouchUpInside += ButtonTouchEventHandler;
View.AddSubview(Button);
}

void ButtonTouchEventHandler(object sender, EventArgs e){}
}

我的 MainWindow 有一个 NavigationController,它执行以下操作:
  • 它推送了一个新的 TestViewController 实例(因此只有 NavigationController 引用了 TestViewController 实例)
  • TestViewController 通过标准的后退按钮弹出(如果我没有注册到 TouchUpInside,TestViewController 的终结器会被调用)
  • 当我返回到 MainWindow 时,一个按钮允许我调用 GC.Collect 只是为了确定。
  • 最佳答案

    是的,对象图有可能被锁定在这种模式中,我已经在 MonoTouch 的下一个主要版本(MonoTouch 4)中修复了它

    关于garbage-collection - UIView 事件和垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4902967/

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