当您推送新视图时,UINavigationViewController中的根视图会发生什么?

时间:2009-02-04 06:35:55

标签: iphone cocoa-touch memory-management

具体来说,我应该怎样处理现在在推送新视图控制器后隐藏的视图? 在我的情况下,我有一个动画视图,在视图关闭后继续执行。

是否有一些公认的惯例? 我是否从内存中删除了View Controller和View? Cocoa Touch有一个方便的方法来“暂停”视图(和控制器)并将其从内存中删除,并在需要时(弹出后)将其恢复存在吗? 我是否必须自己存档然后取消存档?

有什么例子可以指出我吗?

谢谢

3 个答案:

答案 0 :(得分:3)

另一种可能的解决方案是实现以下两种方法:

– viewWillAppear:  
– viewDidAppear:  
– viewWillDisappear:  
– viewDidDisappear: 

您可以在viewWillDisappearviewDidDisappear中停止动画,然后在viewWillAppearviewDidAppear中重新启动动画。您还可以在停止之前存储有关动画的任何必要状态信息。

答案 1 :(得分:2)

在内存不足的情况下,如果控制器的'view'属性不在屏幕上,它的'view'属性将自动设置为nil。然后视图将在需要时自动再次加载 - 并且此时应调用viewDidLoad。

如果您的视图控制器保留了顶级视图的任何子视图,那么您可能希望覆盖视图控制器的setView:方法,检查视图是否设置为nil,如果是,则释放您的子视图固定。否则,顶级视图可能永远不会被释放。

- (void)setView:(UIView *)view
{
    [super setView:view];
    if (view == nil)
    {
        // Release other views
        // self.someView = nil;
    }
}

答案 2 :(得分:1)

每当你调用pushViewController时,当前的viewcontroller都会被导航控制器存储在一个数组中(可以使用navcontroller的viewControllers属性访问它)。

将其视为堆栈。在调用pushViewController时,会在当前viewcontroller顶部的堆栈中添加一个新的viewcontroller。但是你的rootviewcontroller仍在内存中。当你调用popViewController时,该视图控制器将从堆栈中删除并释放。

因此,如果您想在视图消失时停止动画,请使用Andy建议的viewWillDisappear方法。