我将应用程序中的导航从使用 UITabBarController 更改为 u UINavigationController。 IE。以前的解决方案(第 1 版)仅基于 TabBarController - 4 个 ViewController(一个简单的 TableView、一个简单的自定义 View 和一个带有许多叠加层的 MapView)。第二个版本仅基于 UINavigationController。
在 TabBarController 的情况下,它清晰而简单,一切正常,尤其是 MapView。我的意思是:MapView 被加载一次(有大量的叠加层),当我转到另一个 View 并返回 MapView 时,MapView 仍然存在,其叠加层已经加载并显示(简单检查:MapView 的 viewDidLoad 被调用每次应用程序运行一次,我在那里有一些调试消息)。
现在我将导航逻辑更改为 UINavigationController。第一次看时一切正常 - 但是:每次导航到 View 时都会调用 viewDidLoad(对于每个 View )。这很烦人,尤其是在 MapView 的情况下 - 每次都执行叠加层的加载,这需要一些时间,并且在某些情况下会导致应用程序崩溃。
好的,我的问题:
我知道逻辑可能更复杂,但我感谢任何答案或提示;)
一些相关情况:
最佳答案
一个 UITabBarController
和 UINavigationController
是基于根本不同的范式。UITabBarController
适用于 UIViewController
在每个选项卡上彼此独立存在,供用户选择他们想要查看的内容。 viewDidLoad
每个 UIViewController
只被调用一次因为即使用户切换到不同的选项卡,每个选项卡仍然存在于内存中。UINavigationController
是一堆UIViewControllers
每一个都与自身上下的相关。顶UIViewController
堆栈中始终是用户可见的那个。当UIViewController
被插入堆栈,其 viewDidLoad
被调用是因为它正在加载到内存中。当顶UIViewController
从堆栈中弹出,从内存中卸载,然后 viewDidUnload
在退出时被调用(viewDidUnload
在 iOS6 中已弃用,不会被调用,但 Controller 仍会从内存中转储)。这就是为什么viewDidLoad
每次用户推送特定的 UIViewController
时都会被调用到 UINavigationController
堆。
关于ios - 使用 NavigationController 时 View 的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15311656/