uikit——UIViewController——生命周期

本文详细介绍了UIViewController的生命周期,包括loadView、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear、viewWillUnload和viewDidUnload等关键方法。在loadView之后,视图层级被创建;在viewWillAppear和viewDidAppear之间,视图被添加到窗口;在viewWillDisappear和viewDidDisappear之间,视图从窗口移除。此外,还提到了在viewWillAppear和viewWillDidAppear之间的视图绘制过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生命周期

相关方法

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值