【问题标题】:viewDidUnload not called for alloc/init initialized viewcontroller with no xib file没有 xib 文件的 alloc/init 初始化视图控制器不调用 viewDidUnload
【发布时间】:2012-06-15 12:10:21
【问题描述】:

当我通过模拟器模拟任何 iOS 版本的内存警告时,为什么不调用 viewDidUnload 方法?似乎从未调用过此方法。

如果我通过 alloc/initWithNibName 使用 xib 文件创建控制器,则成功调用 viewDidUnload 方法。 为什么会这样?所有视图控制器是否都需要 xib 文件才能正常处理内存警告?

【问题讨论】:

    标签: ios memory-management viewdidunload memory-warning


    【解决方案1】:

    viewDidUnload 会在收到内存警告时调用,并为每个具有不可见视图的视图控制器调用它,例如 UINavigationController 如果您推送新视图控制器并且此视图控制器会导致内存不足呈现视图控制器viewDidUnload 将被调用(因为它的视图不可见)

    另请注意,如果您实现 didReceiveMemoryWarning 并且不调用 [super didReceiveMemoryWarning];,则您的 viewDidUnload 不会被调用

    例如,如果你的视图控制器中有这个

    - (void)didReceiveMemoryWarning
    {
        //with 
        [super didReceiveMemoryWarning]; // viewDidUnload gets called
    
        //without [super didReceiveMemoryWarning]; viewDidUnload does not get called
    }
    

    【讨论】:

    • 我没有覆盖 didReceiveMemoryWarning 方法并且 viewDidUnload 仍然没有被调用。
    • 您想要接收 viewDidUnload 的视图控制器在屏幕上是否仍然可见?如果是,那么它不会收到它
    • 确保它在屏幕上不可见,我从这个控制器中弹出
    【解决方案2】:

    我解决了我的问题。 我没有xib的实现只需要添加这段代码:

    - (void) loadView {
       UIView * myView = [[[UIView alloc] init] autorelease];
       self.view = myView;
    }
    

    【讨论】:

      【解决方案3】:

      受测试计划条款的限制,我认为我们无法详细讨论 iOS 6 Beta,但我也可能建议您在第 8 页 iOS 6 中查看第 6 页底部关于 viewWillUnload 和 viewDidUnLoad 的 Beta 1 发行说明。

      【讨论】:

        猜你喜欢
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        • 2014-03-09
        • 1970-01-01
        相关资源
        最近更新 更多