ios - 使用 NavigationController 时 View 的内存管理

标签 ios uinavigationcontroller uitabbarcontroller viewdidload viewdidunload

我将应用程序中的导航从使用 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 的情况下 - 每次都执行叠加层的加载,这需要一些时间,并且在某些情况下会导致应用程序崩溃。

好的,我的问题:

  • 它是 NavigationController 的某种“常见”行为吗?
  • 我可以更改此行为以便仅调用一次 viewDidLoad 吗?
  • 还有更多 - 如何影响某些 View 的“显示顺序”?

  • 我知道逻辑可能更复杂,但我感谢任何答案或提示;)

    一些相关情况:
  • TabBar 和 Navigation Controller 未组合。
  • 我使用 Storyboard,segues 是在 UIB 中设计的,在我的代码中没有像 perfomSegue 或 prepareForSegue 这样的手动调用。一键触发转至 MapView。
  • 我使用推segues。
  • 我也尝试使用模态转场,但没有改变这种行为。
  • 在 View 之间的转场期间,永远不会调用任何 viewDidUnload。
  • 未收到内存警告。
  • 在模拟器和 iPhone 4 上均未测出内存泄漏。
  • 我试图构建一个非常简单的临时项目/应用程序,它只关注导航。没有任何编码的 Controller 和其他 View ,只是 Storyboard。这是同样的行为。
  • 当我快速并定期点击一个 View 和 MapView 之间的导航按钮和后退按钮时,有一个问题会导致应用程序崩溃。在大多数情况下,当我在 MapView 完全显示(即其叠加层)之前点击 MapView 上的后退按钮时,应用程序会崩溃。当我添加 1 秒时它被修复了。在 MapView 中的 viewDidDisappeared 中调用延迟方法。这不是一个公平的解决方案,我知道;)
  • 最佳答案

    一个 UITabBarControllerUINavigationController是基于根本不同的范式。
    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/

    相关文章:

    ios - Objective-C 内存管理问题

    ios - 如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController

    ios - 过渡到导航 View Controller

    iphone - 如何更改uinavigationbar背景颜色而不覆盖drawRect :

    ios - UITabBarController 与 UIViewControllers 和 UITableViewControllers

    iphone - iOS 5.1 上的 ffmpeg undefined symbol 错误

    objective-c - iPad 应用程序。退出(0)留在 'taskbar'

    iphone - UINavigationController 和 UIViewController 释放

    iPad UIModalPresentationFormSheet 与 UITabBarController 的 moreNavigationController 编辑模式问题

    iphone - 第二次点击时未设置 UITabBarItem 上的自定义背景