【问题标题】:iOS 6 deprecation of viewWillUnload & move to didReceiveMemoryWarningiOS 6 弃用 viewWillUnload 并移至 didReceiveMemoryWarning
【发布时间】:2012-09-21 19:06:55
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 您目前在您的应用中使用 viewDidUnload 做什么?

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


【解决方案1】:

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

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

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

编辑

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

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

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

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

我不知道您所说的“进一步了解导航控制器堆栈”是什么意思,因此您需要澄清该示例以便我提供有用的响应。

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

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

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

【讨论】:

  • 请问:那些“合适的地方”是什么?我曾经在 view[Will/Did]Disappear 不完全足够的某些情况下使用 ViewdidUnload。就像在导航控制器堆栈上走得更远。您介意进一步详细说明吗?
  • @Dan1one: 嗯...viewDidUnload 在从堆栈中弹出时或在大多数其他情况下不会被调用。所以我不知道你在做什么
  • 几个月来我看到的最棒的答案。谢谢!
  • In general, you should be able to do all the viewDidUnload type work in didReceiveMemoryWarning and dealloc。那么viewWillUnload 的等效函数是什么?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 2012-09-22
      相关资源
      最近更新 更多