ios5:停止视图被卸载/停止 viewDidUnload 被调用

Posted

技术标签:

【中文标题】ios5:停止视图被卸载/停止 viewDidUnload 被调用【英文标题】:ios5: stopping views from being unloaded / stopping viewDidUnload being called 【发布时间】:2012-10-17 11:40:10 【问题描述】:

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

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

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

【问题讨论】:

您确定即使在 iOS5 上它也“不再节省大量内存”?据推测,iOS6 中的优化使旧机制过时了。 在 viewDidLoad 中放置一个保留并且在 dealloc 之前没有释放意味着 dealloc 永远不会被调用,所以不,这不是您想要处理的方式。 @FilipRadelic 我建议在 self.view 上保留 - 据我所知,这不会阻止 self 被释放,尽管由于其他原因可能是一个坏主意。 @Thilo 不,我绝对不确定。 WWDC 视频似乎暗示卸载视图在“一段时间”内没有产生任何明显差异。我想我需要做一些测量才能确定。 【参考方案1】:

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

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

【讨论】:

错了——在 iOS 5 中已经可以通过重写 didReceiveMemoryWarning 来实现。 @madboy 谢谢!如果您知道任何明确的参考资料,我很想知道支持商店是否会在 iOS5 上发布。 @Eiko 我更正了我上面的陈述:不支持这样做。覆盖 didReceiveMemoryWarning 可能会产生其他副作用,正如您不知道的那样,UIViewController 在 didReceiveMemoryWarning 中做了什么! @JosephH 抱歉,我不确定,但您可能想在 didReceiveMemoryWarning 中设置一个断点,看看 iOS 5 在这个调用中做了什么。【参考方案2】:

现在的主要区别是 didReceiveMemoryWarning 中的视图不会自动卸载,并且 viewDidUnload 不会被调用。

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

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

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

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

【讨论】:

以上是关于ios5:停止视图被卸载/停止 viewDidUnload 被调用的主要内容,如果未能解决你的问题,请参考以下文章

iOS5 -webkit-overflow-scrolling 导致触摸事件停止工作

当用户在 iOS 5 上锁定屏幕时 applicationMusicPlayer 停止

如何停止在WPF列表视图中每个项目输出的标签被重复。

停止页面卸载/关闭

Docker CE 安装卸载及启动停止

组件卸载时停止执行我的 React for 循环