美文网首页
UIViewController从 init 到 dealloc

UIViewController从 init 到 dealloc

作者: Creator_Jeff | 来源:发表于2019-08-13 08:51 被阅读0次

1、 控制器创建

当我们使用storyboard加载controller时系统会调用此方法创建控制器

// 控制器初始化方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder 

当我们使用代码创建或者使用xib创建时会走下面这个创建方法

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

当你使用 [[UIviewController alloc] init] 创建控制器时会调用 inittWithNibName: nil bundle:nil 这时候系统会做以下操作,首先检查有没有和控制器同名的xib,有的话加载视图,没有的话创建一个空的view赋值给 self.view。如果你传入的nib不为空会去找你对应nibname的xib 加载。

2、加载视图

loadview
- (void)loadView {
    [super loadView];
}

loadView方法 创建viewController 的 view, 如果子类重写了loadVie 要调用 [super loadView], 这样能保证控制器会有View,因为如果你传入的nibName无效 [super loadView]也会创建一个空的view,如果你不调用super 直接重写loadView 则一定要保证在loadView中创建view : self.view = 创建view; 如果loadView 得不到创建的view 控制器就会报错。

viewDidLoad
- (void)viewDidLoad {
    [super viewDidLoad];
}

view的数据加载完成时调用,这时候viewController的 self.view 已经有值了,可以在这个方法里面做一些附加操作,添加动态的subviews。viewDidLoad会在view加载完成调用一次。

\color{red}{注意}:如果重写了loadeView但是没有创建view导致loadView失败,则会重复的调用loadView 和 viewDidLoad。

viewWillUnload、 viewDidUnload
- (void)viewWillUnload {
    [super viewWillUnload];
}

- (void)viewDidUnload {
    [super viewDidUnload];
}

这两个方法两个在iOS6已经废弃。原本是因为在系统报内存警告时会在调用 viewWillUnload 释放view后调用 viewDidUnload,然后再需要显示的时候会重新调用viewDidLoad, 所以可以在viewDidUnload 释放我们创建的view。废除的原因 请看这篇博客
再见,viewDidUnload方法 这篇博客做了废弃方法的解释。

viewWillAppear: & viewDidAppear:
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
}

viewWillAppear: 一般在view添加到superView 之前,切换界面之前调用,在这里可以做一些显示前的动画比如键盘弹起,一些特殊的过程动画,比如处理navigationBar的颜色。

viewDidAppear: view显示后,切换动画后,如果需要做出处理可以在这里实现。

viewWillLayoutSubviews & viewWillLayoutSubviews
- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
}

苹果对这两个方法解释很简单,viewWillLayoutSubviews就是控制器的view的layoutSubviews执行之前执行,viewDidLayoutSubviews是在控制器view的layoutSubviews执行之后执行,可以做一下需要的操作。layoutSubviews执行的时机这里不在赘述,这两个方法会在 viewWillAppear 和 viewDidAppear 之间执行

viewWillDisappear: & viewDidDisappear
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
}

viewWillDisappear:view 从其他view移除之前调用,在返回的切换动画之前执行,移除后同样也是动画结束后会调用viewWillDisappear

3、控制器释放

- (void)dealloc {
    
}

在控制器即将释放时调用,控制器生命周期结束可以在这个方法里面释放我们自己创建的资源。

相关文章

网友评论

      本文标题:UIViewController从 init 到 dealloc

      本文链接:https://www.haomeiwen.com/subject/rwwzdctx.html