iOS 6弃用了viewWillUnload&转到didReceiveMemoryWarning

时间:2012-09-21 19:06:56

标签: objective-c cocoa-touch ios6 didreceivememorywarning viewdidunload

我是新开发者,即将推出我的第一款应用。我对于viewDidUnload的弃用感到困惑,如下面Apple Apple的iOS 6发行说明所述:

  

在iOS 6中,viewWillUnload和viewDidUnload方法   UIViewController现已弃用。如果您使用这些方法   要发布数据,请改用didReceiveMemoryWarning方法。您   也可以使用此方法释放对视图的引用   控制器的视图是否未被使用。你需要测试一下   在执行此操作之前,视图不在窗口中。

为什么会这样?我应遵循哪些指导原则来确保此更改不会在我的应用中导致任何性能问题?

感谢。

3 个答案:

答案 0 :(得分:18)

根据Apple的说法,他们已经改进了内部内存管理,足以使viewWill/DidUnload中破坏内容所获得的收益微乎其微。此外,他们还有数据显示许多应用程序崩溃,因为应用程序无法正确处理这些通知,并执行与视图卸载无关的“其他”内容。

最后,内存警告现在被验证为在应用程序因内存不足而终止之前将获得的第一个也是唯一的警告,因此它确实是处理内存问题的地方。

所以,基本上,只需删除您的viewWillUnloadviewDidUnload方法即可。处理didReceiveMemoryWarning中的内存问题以及适当位置的任何其他视图控制器管理。

修改

  

请问:那些“合适的地方”是什么?我以前用过   ViewdidUnload在视图[Will / Did]消失的某些情况下   不完全足够。就像在导航上走得更远   控制器堆栈。你还想进一步详细说明吗? -   Dan1one

这取决于。我知道这不是你想听到的,但事实是真的: - )

一般来说,你应该避免不对称。因此,您应该使用对比方法“撤消”操作,您可以从中“执行”原始操作。通常,您应该能够在viewDidUnloaddidReceiveMemoryWarning中完成所有dealloc类型的工作。

这应该不会导致更改,因为无论如何你必须在这两个地方复制大部分代码。

我不知道你的意思是“在导航控制器堆栈上更进一步”,所以你需要澄清这个例子让我提供有用的回应。

使用viewDidDisappearviewDidAppear的一个问题是,很难知道视图何时出现,因为它实际上正在显示,或者因为其上方的视图正在消失......导致它出现。

这些API应该可以帮助您解决这些问题:

- (BOOL)isMovingFromParentViewController
- (BOOL)isMovingToParentViewController
- (BOOL)isBeingDismissed
- (BOOL)isBeingPresented

答案 1 :(得分:8)

在iOS 6中,永远不会卸载视图。

这意味着loadViewviewDidLoad只会被调用一次,viewDidUnload永远不会被调用。因此,如果您的视图控制器使用viewDidUnload来处理低内存条件,那么它将需要更改。

如果要响应内存不足的情况,请实现didReceiveMemoryWarning并以此方法释放临时数据和对象。

答案 2 :(得分:6)

在iOS 6中,我们应该自己发布视图,做这样的事情

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

    if([self isViewLoaded] && self.view.window == nil)
    {
        self.view = nil;
    }
}