16

我是即将推出我的第一个应用程序的新开发人员。我对viewDidUnload以下 Apple 的 iOS 6 发行说明中所述的弃用感到困惑:

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

为什么会这样?我应该遵循哪些准则来确保此更改不会导致我的应用出现任何性能问题?

谢谢。

4

3 回答 3

19

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

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

所以,基本上,只需删除你的viewWillUnloadandviewDidUnload方法。在适当的位置处理内存问题didReceiveMemoryWarning和任何其他视图控制器管理。

编辑

请问:那些“合适的地方”是什么?我曾经在 view[Will/Did]Disappear 不完全足够的某些情况下使用 ViewdidUnload。就像在导航控制器堆栈上走得更远。您介意进一步详细说明吗?– Dan1one

那要看。我知道这不是你想听到的,但这是事实:-)

一般来说,你应该避免不对称。因此,您应该使用您“执行”原始操作的对称方法“撤消”操作。一般来说,你应该能够完成所有viewDidUnload类型的工作didReceiveMemoryWarningdealloc

这实际上不应该引起更改,因为无论如何您都必须在这两个地方复制大部分代码。

我不知道您所说的“在导航控制器堆栈上走得更远”是什么意思,因此您需要澄清该示例,以便我提供有用的响应。

使用viewDidDisappearand的问题之一viewDidAppear是很难知道视图何时出现,因为它实际上正在出现,或者因为它上面的视图正在消失......导致它出现。

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

- (BOOL)isMovingFromParentViewController
- (BOOL)isMovingToParentViewController
- (BOOL)isBeingDismissed
- (BOOL)isBeingPresented
于 2012-09-21T21:18:17.177 回答
8

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

这意味着loadViewandviewDidLoad只会被调用一次,并且viewDidUnload永远不会被调用。因此,如果您的视图控制器用于viewDidUnload处理内存不足的情况,那么它将需要更改。

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

于 2012-09-21T21:42:55.163 回答
6

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

    if([self isViewLoaded] && self.view.window == nil)
    {
        self.view = nil;
    }
}
于 2012-10-01T06:17:07.770 回答