面试题答案
一键面试优化见解
- 视图控制器生命周期管理:确保在视图控制器不再需要时,其内存能及时释放。例如,当一个视图控制器从导航栈中弹出或者标签栏切换到其他页面时,对应的视图控制器及其相关资源应被合理释放,避免持有不必要的引用。
- 懒加载:对于导航栏和标签栏中展示的内容,特别是一些较重的视图,采用懒加载的方式。只有在真正需要显示时才加载相关视图及其数据,而不是在应用启动或页面切换时就提前加载所有内容。
- 避免循环引用:在视图控制器之间、视图与视图控制器之间的引用关系要处理好,防止循环引用导致内存无法释放。例如,代理模式使用不当可能会引发循环引用,应确保代理使用
weak
或者unsafe_unretained
修饰符。 - 资源管理:对于导航栏和标签栏中使用的图片、音频等资源,在其不再使用时及时释放。比如在视图控制器的
dealloc
方法中释放图片对象,避免资源长时间占用内存。
具体实现措施
- 视图控制器生命周期处理
- (void)dealloc { // 释放视图控制器持有的强引用对象 self.someStrongReference = nil; // 移除通知观察者 [[NSNotificationCenter defaultCenter] removeObserver:self]; // 取消网络请求等任务 [self.task cancel]; }
- 懒加载视图
- (UIView *)lazyLoadedView { if (!_lazyLoadedView) { _lazyLoadedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; // 配置视图 [_lazyLoadedView setBackgroundColor:[UIColor whiteColor]]; } return _lazyLoadedView; }
- 防止循环引用
- 代理声明:在协议声明时,使用
weak
修饰代理属性,例如在视图控制器中:
@protocol MyDelegate <NSObject> - (void)someDelegateMethod; @end @interface MyViewController : UIViewController @property (nonatomic, weak) id<MyDelegate> delegate; @end
- 块使用:在使用块时,为避免循环引用,使用
__weak
修饰当前视图控制器,例如:
__weak typeof(self) weakSelf = self; self.completionBlock = ^{ __strong typeof(weakSelf) strongSelf = weakSelf; if (strongSelf) { // 使用strongSelf访问视图控制器属性和方法 [strongSelf doSomeTask]; } };
- 代理声明:在协议声明时,使用
- 资源释放
- 图片资源:在视图控制器的
dealloc
方法中释放图片对象
- (void)dealloc { self.imageView.image = nil; }
- 音频资源:如果使用
AVAudioPlayer
播放音频,在dealloc
中停止并释放
- (void)dealloc { [self.audioPlayer stop]; self.audioPlayer = nil; }
- 图片资源:在视图控制器的