UIViewController生命周期
生命周期
viewController有自己的生命周期,如图:
init:初始化程序
loadView() 当需要展示UIViewController的view为空时调用
viewDidLoad() 视图加载完成后调用,类成员对象和变量的初始化都在这里再创建类后无论视图展现还是消失,这个方法都只会在布局时调用一次
viewWillAppear() 视图即将展现时调用
viewDidAppear() 视图已经出现时调用
viewWillLayoutSubviews() 用于处理视图布局时的变化,通常在这里执行与布局相关的操作,在子视图重新布局之前调用
viewDidLayoutSubviews() 用于处理视图布局的变化, 在子视图重新布局结束后调用
viewWillDisappear() 视图即将消失时调用
viewDidDisappear() 视图已经消失时调用
traitCollectionDidChange() 视图控制器的特征集合发生变化时调用
didRecieveMemoryWarning() 系统内存不足时调用
初始化
init方法:初始化UIViewController,执行关键数据初始化操作,不要在此操作view,view只有在loadView:方法中才调用(UIViewController的view是懒加载实现的),在init方法中,view还没创建,用不了self.view。
加载视图
loadView:方法是在UIViewcontroller对象被访问且为nil时调用,该方法会加载并创建一个view并将其赋值给自身的view属性。没有特别情况该方法在viewcontrollrer中只调用一次。可以重写该方法手动初始化view。该方法中不能使用super(如果完全自己画UI的话)
viewDIdLoad:view加载完成后调用,通常情况下,各种初始化数据的载入、初始设定,修改约束,移除视图等很多操作都可以在这个方法中实现‘
viewWillAppear:系统在载入所有的数据后,将会在屏幕上显示视图,这时会先调用这个方法,通常会在这个方法中对即将显示的视图做进一步设置。
viewDidAppear:UIViewController对象的视图已经加载到窗口时调用,可以对正在显示的视图做设置
viewWillDisAppear:视图控制器对象即将消失、被覆盖或者隐藏时调用
viewDidDisAppear:视图控制器对象已经消失、被覆盖、或是隐藏时调用
内存警告
didRecieveMemoryWarning: 在内存足够的情况下,app的视图通常会一直报存在内存中。如果内存不够,系统会向app发送内存警告,此时会调用该方法。会释放掉自己拥有的视图。系统只会释放内存,不会释放对象的所有权。就是说对象仍然存在,但是内部的数据被释放了。
视图销毁
dealloc方法:销毁视图,释放资源。当对象的引用计数为0时自动调用
注意
viewDidload可能调用多次,而loadView只调用一次(一般情况下)
示例
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface FirstVC : UIViewController
@end
NS_ASSUME_NONNULL_END
#import "FirstVC.h"
#import "SecondVC.h"
@interface FirstVC ()
@end
@implementation FirstVC
- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor yellowColor];self.title = @"视图一";// Do any additional setup after loading the view.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {SecondVC* vc = [[SecondVC alloc] init];[self.navigationController pushViewController:vc animated:YES];
}
@end
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface SecondVC : UIViewController
@end
NS_ASSUME_NONNULL_END
#import "SecondVC.h"
@interface SecondVC ()
@end
@implementation SecondVC
- (void)viewDidLoad {[super viewDidLoad];self.title = @"视图二";self.view.backgroundColor = [UIColor systemBlueColor];// Do any additional setup after loading the view.NSLog(@"%s", __func__);
}
- (void)loadView {[super loadView];NSLog(@"%s", __func__);
}
- (instancetype)init {self = [super init];NSLog(@"%s", __func__);return self;
}
- (void)viewWillAppear:(BOOL)animated {NSLog(@"%s", __func__);
}
- (void)viewDidAppear:(BOOL)animated {NSLog(@"%s", __func__);
}
- (void)viewWillLayoutSubviews {NSLog(@"%s", __func__);
}
- (void)viewWillDisappear:(BOOL)animated {NSLog(@"%s", __func__);
}
- (void)viewDidDisappear:(BOOL)animated {NSLog(@"%s", __func__);
}
- (void)viewDidLayoutSubviews {NSLog(@"%s", __func__);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {[self.navigationController popViewControllerAnimated:YES];
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/
@end
我们打印出结果如下