Skip to content

Instantly share code, notes, and snippets.

@xiangyuan
Last active October 7, 2015 12:27
Show Gist options
  • Save xiangyuan/3164566 to your computer and use it in GitHub Desktop.
Save xiangyuan/3164566 to your computer and use it in GitHub Desktop.
ios中ViewController加载过程描述
iewController的初始化:
从Storyboards中加载的时候,会调用initWithCode,如果不存在则调用init。之后对里面的每个对象调用awakeFromNib方法。
从内存中alloc出来的情况下,调init方法。
ViewController查找与其关联的view,其顺序是:
1 先判断子类是否重写了loadView,如果有直接调用。之后调viewDidLoad完成View的加载。
2 如果是外部通过调用initWithNibName:bundle指定nib文件名的话,ViewController记载此nib来创建View。
3 如果initWithNibName:bundle的name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib。
A 如果类名包含Controller,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib;
B 找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib。
4 如果子类没有重写的loadView,则ViewController会从StroyBoards中找或者调用其默认的loadView,默认的loadView返回一个空白的UIView对象。
注意第一步,ViewController是判断子类是否重写了loadView,而不是判断调用子类的loadView之后ViewController的View是否为空。就是说,如果子类重写了loadView的话,不管子类在loadView里面能否获取到View,ViewController都会直接调viewDidLoad完成View的加载。
ViewController的卸载View的步骤:
1 系统发出警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
2 调用viewWillUnload之后释放View
3 调用viewDidUnload
5,在需要显示之前,viewWillAppear会被调用,显示完毕viewDidAppear会被调用(从其它程序切换回来显示这个页面的时候,这两个函数是不会被调用的)
6,在跳转到本程序其它页面的之前(presentModelViewController, pushViewController),viewWillDisappear会被调用, 之后viewDidDisappear会被调用(按home键退出或者切换到其它程序的时候,这两个函数也是不会被调用的)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment