面试题答案
一键面试通用处理要点
- 释放非必要资源:
- 对于视图控制器中加载的图片、视频等大资源,如果当前不在使用,应及时释放。例如,在
viewDidDisappear:
方法中检查是否有未使用的图片资源,若有则将其设置为nil
。 - 取消网络请求,避免无用的网络数据继续占用内存。在视图控制器中持有网络请求任务对象(如
NSURLSessionTask
),当内存警告发生时,调用cancel
方法取消任务。
- 对于视图控制器中加载的图片、视频等大资源,如果当前不在使用,应及时释放。例如,在
- 清理缓存:
- 如果视图控制器中有自定义的缓存机制,如缓存数据字典等,应在内存警告时进行清理。可以遍历缓存字典,删除近期未使用的缓存项。
- 移除视图:
- 检查视图层级中是否有当前不可见且短期内不会使用的视图,将其从父视图中移除。例如,在复杂视图控制器体系中,一些用于临时展示的弹窗视图,当弹窗消失后,可以将其从父视图移除。
导航控制器(UINavigationController)处理要点
- 清理栈中视图控制器:
- 检查导航栈中是否有可以被释放的视图控制器。如果某些视图控制器已经在栈中停留较长时间且用户不太可能返回,可以考虑将其从导航栈中移除。例如,可以通过遍历
viewControllers
数组,结合业务逻辑判断哪些视图控制器可以移除,然后使用removeFromParentViewController
和view.removeFromSuperview
方法进行移除。
- 检查导航栈中是否有可以被释放的视图控制器。如果某些视图控制器已经在栈中停留较长时间且用户不太可能返回,可以考虑将其从导航栈中移除。例如,可以通过遍历
- 释放导航栏相关资源:
- 如果导航栏有自定义的背景图片、标题字体等资源,在内存警告时,若这些资源当前未被使用,可以释放。例如,将自定义的导航栏背景图片设置为
nil
。
- 如果导航栏有自定义的背景图片、标题字体等资源,在内存警告时,若这些资源当前未被使用,可以释放。例如,将自定义的导航栏背景图片设置为
标签栏控制器(UITabBarController)处理要点
- 处理子视图控制器:
- 遍历标签栏控制器的
viewControllers
数组,对每个子视图控制器执行通用的内存优化处理。例如,调用子视图控制器的自定义内存优化方法(如果有),释放子视图控制器中不必要的资源。
- 遍历标签栏控制器的
- 释放标签栏相关资源:
- 类似于导航栏,若标签栏有自定义的图标、背景等资源,且当前未使用,可以释放。例如,将自定义的标签栏图标图片设置为
nil
。
- 类似于导航栏,若标签栏有自定义的图标、背景等资源,且当前未使用,可以释放。例如,将自定义的标签栏图标图片设置为
普通视图控制器处理要点
- 视图懒加载优化:
- 对于复杂视图,采用懒加载方式。在
viewDidLoad
中不立即加载所有子视图,而是在真正需要展示时才加载。例如,对于一个包含多个分页视图的视图控制器,可以在viewDidLoad
中只初始化分页容器,当用户切换到具体分页时,再加载该分页对应的视图。
- 对于复杂视图,采用懒加载方式。在
- 数据处理优化:
- 如果视图控制器持有大量数据模型,在内存警告时,检查哪些数据当前不在使用且可以重新获取,将其释放。例如,对于一些从网络获取并缓存的数据,如果可以重新请求获取,在内存警告时释放这些缓存数据。