0

鉴于 iOS6 不再卸载视图,因此不再调用UIViewController's viewDidUnload,我想知道是否有可靠的方法在 iOS5 上导致同样的行为?

也就是说,我真的很想停止在 iOS5 上卸载我的视图,原因与 Apple 给出的不再在 iOS 6 上卸载视图的原因相同(因为它不再节省任何大量内存,而且几乎总是额外错误的来源)。我宁愿把时间花在开发有用的功能上,也不愿测试很多现在只能在 iOS5 上发生并且只能在低内存中发生的案例!

我四处搜索,找不到以前问过这个问题的人,这让我感到惊讶。是否可以像在中保留对 self.view 的额外引用一样简单viewDidLoad(并且仅在中释放它dealloc)?有没有可能的陷阱?

4

2 回答 2

1

在 iOS5 上,不支持停止卸载视图,这也会导致巨大的内存问题,因为 iOS6 处理视图的方式完全不同。在 iOS6 中,视图的后备存储仍会在必要时从内存中删除 - 或者至少它被标记为能够从内存中删除。据我所知,在 iOS5 上并非如此。仅当视图本身被移除时,后备存储才会被移除,即使视图本身的大小只有几个字节。

看看这篇很棒的帖子:iOS 6 中的 View Controller Lifecycle 这可能会让您了解您的要求有多复杂。

于 2012-10-17T11:47:44.570 回答
1

现在的主要区别是视图不会在 中自动卸载didReceiveMemoryWarningviewDidUnload也不会被调用。

这并不意味着您不应该卸载您的视图- 事实上,在 WWDC 视频中他们建议在didReceiveMemoryWarning. 现在的主要区别是您完全可以控制发生的事情和时间。许多人依赖的代码viewDidUnload通常不会按预期调用——例如,当只是删除视图并释放控制器时。

如果您不想发布您对内存警告的看法(这可能是也可能不是您想要的),您可以不将 view 属性设置为 nil。如果您didReceiveMemoryWarning的控制器中有一个空的,这也将在 iOS 5 中工作(无需调用 super)。

不过,我认真建议认真对待这些警告。它们是您清理可能未使用的内存的唯一点,并且视图的后备存储可能会变得非常大。

编辑:只有在视图很少、经常使用且内存占用低的情况下,您才应该考虑不卸载视图。

于 2012-10-17T11:49:42.487 回答