MST
星途 面试题库

面试题:Objective-C内存警告时视图控制器的处理策略

当内存警告发生时,对于一个复杂的视图控制器体系(包含多个嵌套的视图控制器),应该如何进行内存优化处理,详细说明不同类型视图控制器(如导航控制器、标签栏控制器等)的处理要点。
26.1万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

通用处理要点

  1. 释放非必要资源
    • 对于视图控制器中加载的图片、视频等大资源,如果当前不在使用,应及时释放。例如,在viewDidDisappear:方法中检查是否有未使用的图片资源,若有则将其设置为nil
    • 取消网络请求,避免无用的网络数据继续占用内存。在视图控制器中持有网络请求任务对象(如NSURLSessionTask),当内存警告发生时,调用cancel方法取消任务。
  2. 清理缓存
    • 如果视图控制器中有自定义的缓存机制,如缓存数据字典等,应在内存警告时进行清理。可以遍历缓存字典,删除近期未使用的缓存项。
  3. 移除视图
    • 检查视图层级中是否有当前不可见且短期内不会使用的视图,将其从父视图中移除。例如,在复杂视图控制器体系中,一些用于临时展示的弹窗视图,当弹窗消失后,可以将其从父视图移除。

导航控制器(UINavigationController)处理要点

  1. 清理栈中视图控制器
    • 检查导航栈中是否有可以被释放的视图控制器。如果某些视图控制器已经在栈中停留较长时间且用户不太可能返回,可以考虑将其从导航栈中移除。例如,可以通过遍历viewControllers数组,结合业务逻辑判断哪些视图控制器可以移除,然后使用removeFromParentViewControllerview.removeFromSuperview方法进行移除。
  2. 释放导航栏相关资源
    • 如果导航栏有自定义的背景图片、标题字体等资源,在内存警告时,若这些资源当前未被使用,可以释放。例如,将自定义的导航栏背景图片设置为nil

标签栏控制器(UITabBarController)处理要点

  1. 处理子视图控制器
    • 遍历标签栏控制器的viewControllers数组,对每个子视图控制器执行通用的内存优化处理。例如,调用子视图控制器的自定义内存优化方法(如果有),释放子视图控制器中不必要的资源。
  2. 释放标签栏相关资源
    • 类似于导航栏,若标签栏有自定义的图标、背景等资源,且当前未使用,可以释放。例如,将自定义的标签栏图标图片设置为nil

普通视图控制器处理要点

  1. 视图懒加载优化
    • 对于复杂视图,采用懒加载方式。在viewDidLoad中不立即加载所有子视图,而是在真正需要展示时才加载。例如,对于一个包含多个分页视图的视图控制器,可以在viewDidLoad中只初始化分页容器,当用户切换到具体分页时,再加载该分页对应的视图。
  2. 数据处理优化
    • 如果视图控制器持有大量数据模型,在内存警告时,检查哪些数据当前不在使用且可以重新获取,将其释放。例如,对于一些从网络获取并缓存的数据,如果可以重新请求获取,在内存警告时释放这些缓存数据。