一、awakeFromNib//initWithCoder差别
(1)awakeFromNib
和initWithCoder
:差别awakeFromNib
从xib
或者storyboard
加载完毕就会调用initWithCoder
: 只要对象是从文件解析来的,就会调用同时存在会先调用initWithCoder
:
(2)initWithCoder
: & initWithFrame
:initWithCoder
:使用文件加载的对象调用(如从xib或stroyboard中创建)initWithFrame
:使用代码加载的对象调用(使用纯代码创建)注意:所以为了同时兼顾从文件和从代码解析的对象初始化,要同时在initWithCoder
: 和 initWithFrame``: 中进行初始化
2、loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder 调用摘录
有些需要待验证。。。。。。。。。。。。。。。。。。。。。
** 1、**区别程序化初始
viewcontroller
,半程序化初始和IB初始的区别.
代码化初始:完全没有Xib
之类的东西,通过纯代码实现加载.
半代码化:设计xib
,然后在程序中用代码调用xib
来初始化.
2、完全
IB
化:设计xib
之类,然后加入到其它xib
里.如MainWindow.xib
中加入rootviewController
,而rootviewcontroller
通过xib
设计.或者tabbarcontroller
中加入多个由xib
设计的viewcontroller
,这些都是通过IB
来初始化的.
好了,了解了这些,来看看各种方法的使用.
- (1)、
viewDidLoad
:这个方法在三种方式下都会调用,而且是加载完view
后调用.- (2)、
loadView
:代码初始化程序时设计view
用. 半代码化时和完全IB化初始时亦调用,但会重写xib
中的view
,调用在initwithNibName
之后,viewDidLoad
之前.- (3)、
initWithNibName
:半代码化初始时使用. 完全IB化初始时不调用,UIViewController
代码化初始时会通过init
调用,且调用在[super init]
中.- (4)、
awakeFromNib:
这个方法是一个类在IB中被实例化是被调用的.看了帖子发现大家都推荐使用viewDidLoad
而不要使用awakeFromNib
,应为viewDidLoad
会被多次调用,而awakeFromNib
只会当从nib
文件中unarchive
的时候才会被调用一次.实际测试中发现,当一个类的awakeFromNib
被调用的时候,那么这个类的viewDidLoad
就不会被调用了,这个感觉很奇怪.- (5)、
initWithCoder
是一个类半代码化实例时被调用的.比如,通过IB
创建一个controller
的nib
文件,然后在xocde
中通过initWithNibName
来实例化这个controller
,那么这个controller
的initWithCoder
会被调用.
调用顺序: super init->initWithNibName(其实在super init中) ->int after self created->loadView->ViewDidLoad
网友评论