源码

首页 » 归档 » 源码 » iOS控制器View加载顺序详细版-ios学习从入门到精通尽在姬长信

iOS控制器View加载顺序详细版-ios学习从入门到精通尽在姬长信

分享最热门的ios资讯

加载过程:

1 一般情况下调用 init要领或者调用initWithNibName要领实例化UIViewController, 不管调用哪个要领都为调用initWithNibName(要领界说如下)

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

2 接着会调用loadView要领来生成UIViewController.view

- (void)loadView

下面来简单说下loadView底层

2.1.1.判断下有没有指定storyboard,如果有,就去加载storyboard描述的控制器的view
2.1.2.判断下有没有指定nibName,如果有,就去加载nibName描述的控制器的view

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

如果判断有没有指定nibName,[self nibName]
2.1.3判断下nibName是否为空,如果为空,他会尝试找下有没有跟控制器同名,但是不带Controller的xib
2.1.4跟控制器同名的xib,nibName = ViewController,但是这一步有条件,前提条件你没有重写loadView
2.1.5如果都没有找到,直接创建默认控制器的view

3 - (void)awakeFromNib;

这个要领用的时候,outlet还没有连接起来,是view Controller刚从storyboard建的时候,没有完全建好,不过可能有一些事情要在这个要领里面完成,比如splitViewDelegate,需要在非常早期完成。然后调用 viewDidLoad要领
4  - (void)viewDidLoad

如果loadView不能生成UIViewController.view系统将会重复调用loadView及viewDidLoad要领, 而且最终调用[super loadView] 要领返回UIViewController.view
然后依次调用如下2个要领, 这2个要领也十分重要, 在UINavigationController的POP操作后有时将要显示的UIViewController中的View并没有释放(也有可能释放掉) , UIViewController将不会调用上面的三个要领(initWithNibName,loadView,viewDidLoad) 而会调用下面这2个要领
 5  - (void)viewWillAppear:(BOOL)animated;

6  - (void)viewDidAppear:(BOOL)animated;
紧接着调用下面两个要领view中frame值结构,使子控制器的frame值越发准确
  7  - (void)viewWillLayoutSubviews
  8 -(void)viewDidLayoutSubviews

9 卸载过程

- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
- (void)viewWillUnload;//iOS5.0添加- (void)viewDidUnload;
- (void)dealloc;

控制器View一些要领的区分

viewDidLoad其实没什么可混淆的,无论通过什么途径加载(Xcode或者IB,这里的加载属于实例化)完view后肯定会执行这个要领.
loadView需要分两种情况.当你通过Xcode实例化一个类的时候就需要自己在controller中实现这个要领.而在IB中实例化就不需要实现它.
initWithNibName这个要领是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的.
awakeFromNib这个要领是一个类在IB中被实例化是被调用的.看了帖子发现大家都推荐使用viewDidLoad而不要使用awakeFromNib,应为viewDidLoad会被多次调用,而awakeFromNib只会当从nib文件中unarchive的时候才会被调用一次.实际测试中发现,当一个类的awakeFromNib被调用的时候,那么这个类的viewDidLoad就不会被调用了,这个感觉很奇怪.
initWithCoder是一个类在IB中创建但在Xcode中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xocde中通过initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.
awakeFromNib 当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个工具,每个工具都可以界说自己的awakeFromNib函数来响应这个消息,执行一些须要的操作。也就是说通过nib文件创建view工具是执行awakeFromNib

viewDidLoad 当view工具被加载到内存是就会执行viewDidLoad,所以不管通过nib文件还是代码的方式创建工具都会执行viewDidLoad

文章转自 _那有只喵的简书
用意志战胜身体的惰性!

(0)

本文由 姬長信 创作,文章地址:https://blog.isoyu.com/archives/1242.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:9 月 28, 2016 at 07:59 上午

关键词:

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复