@fiy-fish
2016-11-20T16:21:00.000000Z
字数 2341
阅读 1868
iOS
控制器的生命周期
- load
- initialize
- init(initWithNibName)
- loadView
- viewWillDidLoad
- viewWillAppear
- viewDidAppear
- viewWillDisappear
- viewDidDisappear
- viewWillUnload (iOS 5 and earlier)
- viewDidUnload (iOS 5 and earlier)
- dealloc
load
一般情况下,用不到这个方法 Method Swizzling
方法交互,除非真的没有别的法子了,不要轻易使用这个黑魔法initialize
一般情况下,不会用到这个方法 init(initWithNibName)
初始化控制器 [[selfViewController alloc] init]
或者[[selfViewController alloc] initWithNibName:nibName bundle:nil];
初始化controller init
也会调用 initWithNibName
(前提是有xib文件) 注意下面的代码会调用viewDidLoad(给你造成viewDidLoad方法不调用的错觉,其实是提前执行了)
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
NSLog(@"%s",__func__);
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[self.view addSubview:label];
}
return self;
}
详细解释下上面的代码--
viewDidLoad的调用时机
:
当我们在控制器外面调用方法
[[selfViewController alloc] init]
或者
[[selfViewController alloc] initWithNibName:nibName bundle:nil];
初始化controller时,又在控制器内部
重写了
init
和
initWithNibName
方法,
且方法中含有
self.view
,这个时候会自动调用viewDidLoad
方法
viewDidLoad
的调用时机,在nib文件已载入内存(即视图树构建完成)之后调用
正常情况下,在viewWillAppear
方法之前调用,
为什么上面的代码调用很怪异呢?
应为在init
和initWtihNibName
中,控制器的view = nil
,这个时候,就要加载nib视图树构建到内存去创建view,然后顺便就调用了viewDidLoad
因为viewDidLoad
只调用一次,以后,这个方法就不会再调用了。
详细查看这里浅论ViewController的加载
loadView
loadView,viewDidLoad及viewDidUnload
除非特别需要,不要重写这个方法
何时调用?
当self.view = nil时,系统会自己调用loadView
方法来给控制器创建一个view背景白色,大小为屏幕大小
加载self.view的三种方式
1.判断当前的控制器是否从StoryBoard加载的.如果是,从StoryBoad当中创建view.
2.如果不是,还会判断当前控制器,是否有xib进行描述.如果有,就会从Xib里面创建View
3.如果也不是xib来描述的,那么它就会给创建一个空的UIView.
为什么要重写loadVeiw
?
1.当控制器的view一进来就是显示一个图片时
2.当控制器一进来就去加载一个网页时.
特别注意:loadView 重写时不调用[super loadView]容易访问到空view
不要在loadView调用self.view的get方法,因为这个时候self.view是空,会造成死循环 这里只需要给self.view 赋值,slef.view = costomView
viewDidUnload
和viewWillUnload
文/geekMole(简书作者)
原文链接:http://www.jianshu.com/p/adfdd0fdb1f5
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
layoutSubviews 是什么时候调用还有updateConstrants什么时候调用
对了,还有awakeNib initWithCode