iOS 3 - 发生内存警告后,UITabBarItems 从 UITabBar 消失

Posted

技术标签:

【中文标题】iOS 3 - 发生内存警告后,UITabBarItems 从 UITabBar 消失【英文标题】:iOS 3 - UITabBarItems disappear from UITabBar after a memory warning occurs 【发布时间】:2011-05-24 02:38:07 【问题描述】:

根据使用旧 ios 硬件的人的大量请求,我目前正在重构和优化我的应用程序,以便它可以在 iOS 3 上运行。话虽如此,我的 UITabBar 出现了故障,我可以在上面进行复制我测试过的所有 iPhone 3G 设备。

该故障似乎已在 iOS 4 中得到修复,但我想知道在此之前是否有其他人也遇到过此故障,并且已经找到了一个(相对优雅的)解决方法。

问题是你可以在下面看到的;当发生内存警告并释放屏幕外的所有视图时,当我将带有标签栏的视图控制器带回屏幕时,所有应该在其中的 UITabBarItems 都消失了。据我所知,它们根本没有被画出来。即点击标签栏没有效果。在设置断点并检查 UITabBar 及其在内存中的项目后,它们都仍然存在(即没有被释放),只是在控制器 loadView 方法中重新创建 UITabBar 时它们没有被重绘。

我的应用程序与官方 Twitter 应用程序的工作方式相似,因为我实现了自己的 UITabBarController 版本,因此我可以正确控制它与父 UINavigationController 的集成。不过,我将它设置为尽可能接近原始 UITabBarController 类,所有子视图控制器都处理它们各自的 UITabBarItems 并在类的 init 方法中初始化它们。一旦通过访问器方法将子视图控制器传递给我的 TabController 对象,就会访问 tabBarItems 并将其添加到 UITabBar 视图中。

有没有人以前见过这种行为并知道我可以解决它的方法?我希望有一个非常简单的解决方案,因为它已经在 iOS 4 中运行,所以我不想把它弄得太糟糕。

非常感谢!

【问题讨论】:

【参考方案1】:

经过一番研究,我想我找到了解决方案。这不是我所追求的最优雅的解决方案,但它确实有效。

我猜在触发内存警告后,UITabBarItem 对象发生了一些事情,基本上导致它们损坏。我尝试了很多东西(刷新 UITabBar,重新创建控制器数组等),但没有任何效果。

我终于发现,如果你完全销毁 UITabBarItems 并在它们的位置分配新的,那么这些将起作用。 :)

所以我对此的最终解决方案是在我的控制器的 viewDidLoad 方法中添加一个额外的条件,如果检测到的系统是 iOS 3,并且已经有一个 UITabBarItems 数组,它将遍历每个,复制出所有需要的属性,销毁它,分配一个新属性,然后将旧属性复制到新属性。

我仍然会留意更好的解决方案(我认为这种方法有一点开销),但幸运的是,在现阶段,iOS 3 旧版支持正变得越来越不成问题。 :)

【讨论】:

听起来不错!当然我对你的应用更感兴趣,因为我看到了一个截图。 :) 链接可用吗? 哈哈谢谢!啊,有一个链接。但不幸的是,我被要求关闭该应用程序。 ^_^; (tim-oliver.com/2011/07/21/on-ipokedex-getting-pulled) 郑重声明,这是我最后一次让我的应用程序兼容 iOS 3。像这样奇怪的怪癖使它成为一场疯狂的噩梦...... iOS 3?是的,再见。让我们听听 Xcode 4.2、ARC 和 Storyboards - mwahaaa。 :) 关于应用下架请求,了解。 (旁注:在开始使用之前,我还与 TPCi 联系过一个应用程序,但由于类似的原因也没有继续!)

以上是关于iOS 3 - 发生内存警告后,UITabBarItems 从 UITabBar 消失的主要内容,如果未能解决你的问题,请参考以下文章

iOS 在应用程序内存不足警告上淡出音频

内存警告后的导航控制器堆栈问题

内存警告后 WKWebView 变为空白

在 UICollectionView iOS 7 中收到内存警告

收到内存警告时 UICollectionView 维护的单元队列会发生啥?

在 ARC 中收到内存警告