生命周期
相关方法
UIViewController生命周期相关方法都无需开发者直接调用,UIViewController内部会根据当前状态自动调用
注:除loadview外,其他UIViewController生命周期相关方法override时,调用父类对应方法
loadview
- (void)loadView; // This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.
注:负责创建view hierarchy,view hierarchy从nib加载或代码编写
viewDidLoad
- (void)viewDidLoad; // Called after the view has been loaded. For view controllers created in code, this is after -loadView. For view controllers unarchived from a nib, this is after the view is set.
注:view hierarchy加载完毕后调用,view hierarchy从nib加载或代码编写
viewWillAppear
- (void)viewWillAppear:(BOOL)animated; // Called when the view is about to made visible. Default does nothing
viewDidAppear
- (void)viewDidAppear:(BOOL)animated; // Called when the view has been fully transitioned onto the screen. Default does nothing
viewWillDisappear
- (void)viewWillDisappear:(BOOL)animated; // Called when the view is dismissed, covered or otherwise hidden. Default does nothing
viewDidDisappear
- (void)viewDidDisappear:(BOOL)animated; // Called after the view was dismissed, covered or otherwise hidden. Default does nothing
viewWillUnload
- (void)viewWillUnload NS_DEPRECATED_IOS(5_0,6_0) __TVOS_PROHIBITED;
注:ios5及以前,低内存情况出现时,删除当前没有使用views之前调用,可处理一些数据保存工作待以后恢复时使用,view property不为nil,ios6及以后,deprecated
viewDidUnload
- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0) __TVOS_PROHIBITED; // Called after the view controller's view is released and set to nil. For example, a memory warning which causes the view to be purged. Not invoked as a result of -dealloc.
注:ios5及以前,低内存情况出现时,删除当前没有使用views之后调用,可处理一些清理工作,view property为nil,ios6及以后,deprecated
代码演示
@interface FBView : UIView
@end
@implementation FBView
- (void)drawRect:(CGRect)rect
{
NSLog(@"drawRect rect = %@, root = %p, window = %p", NSStringFromCGRect(rect), self.superview.superview, self.window);
}
@end
@implementation ViewController
- (void)loadView
{
NSLog(@"loadView, view = %p", [self viewIfLoaded]);
[super loadView];
NSLog(@"loadView, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
}
- (void)viewDidLoad
{
NSLog(@"viewDidLoad, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
[super viewDidLoad];
NSLog(@"viewDidLoad, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
FBView *fbView = [[FBView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)];
[self.view addSubview:fbView];
}
- (void)viewWillAppear:(BOOL)animated
{
NSLog(@"viewWillAppear, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
[super viewWillAppear:animated];
NSLog(@"viewWillAppear, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
}
- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"viewDidAppear, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
[super viewDidAppear:animated];
NSLog(@"viewDidAppear, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
}
- (void)viewWillDisappear:(BOOL)animated
{
NSLog(@"viewWillDisappear, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
[super viewWillDisappear:animated];
NSLog(@"viewWillDisappear, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
}
- (void)viewDidDisappear:(BOOL)animated
{
NSLog(@"viewDidDisappear, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
[super viewDidDisappear:animated];
NSLog(@"viewDidDisappear, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
}
- (void)viewWillUnload
{
NSLog(@"viewWillUnload, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
[super viewWillUnload];
NSLog(@"viewWillUnload, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
}
- (void)viewDidUnload
{
NSLog(@"viewDidUnload, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
[super viewDidUnload];
NSLog(@"viewDidUnload, view = %p, root = %p, window = %p", self.view, self.view.superview, self.view.window);
}
@end
output:
loadView, view = 0x0
loadView, view = 0x7f929ad30be0, root = 0x0, window = 0x0
viewDidLoad, view = 0x7f929ad30be0, root = 0x0, window = 0x0
viewDidLoad, view = 0x7f929ad30be0, root = 0x0, window = 0x0
viewWillAppear, view = 0x7f929ad30be0, root = 0x0, window = 0x0
viewWillAppear, view = 0x7f929ad30be0, root = 0x0, window = 0x0
drawRect rect = {{0, 0}, {100, 100}}, root = 0x7f929aff96e0, window = 0x7f929aff96e0
viewDidAppear, view = 0x7f929ad30be0, root = 0x7f929aff96e0, window = 0x7f929aff96e0
viewDidAppear, view = 0x7f929ad30be0, root = 0x7f929aff96e0, window = 0x7f929aff96e0
viewWillDisappear, view = 0x7f929ad30be0, root = 0x7f929aff96e0, window = 0x7f929aff96e0
viewWillDisappear, view = 0x7f929ad30be0, root = 0x7f929aff96e0, window = 0x7f929aff96e0
viewDidDisappear, view = 0x7f929ad30be0, root = 0x0, window = 0x0
viewDidDisappear, view = 0x7f929ad30be0, root = 0x0, window = 0x0
总结:
- loadView之前,view为nil,没有创建(加载)view hierarchy,loadView之后,view hierarchy创建(加载)成功
- 在viewWillAppear和viewWillDidAppear之间,view hierarchy加入window
- 在viewWillDisappear和viewDidDisappear之间,view hierarchy从window移除
- view在viewWillAppear和viewWillDidAppear之间draw