在学习iOS教程时,总会遇到初始化的问题,由于分不清initWithCoder, initWithNibName, viewDidLoad等方法的区别,导致学习一头雾水。
在查阅资料之后,打算总结一下自己整理的资料。
定义:
1. initWithCoder: 将归档对象解档过程中调用(也就是在加载nib过程中调用的)。其中归档对象包括nib。
这里就涉及到归档(archive)以及nib等概念。
nib指的是IB(Interface Builder)下保存应用界面的文件,包括storyboard。
归档对象在我看来就是以某种形式存储在文件中,包括nib。
2. awakeFromNib: 当所有在nib中的对象都实例化后调用的方法。
以上两种方法都是利用stroyboard或者xib开发时才会调用的,如果你纯代码编写界面的话就会调用3.中的方法。
3. initWithNibName:bundle: 在加载nib前调用,用于生成控制器的。
总结:
1)如果你用storyboard编写界面,则调用顺序为initWithCoder -> awakeFromNib
2)如果你用纯代码编写界面,则只调用了initWithNibName:bundle:
再说说application:didFinishLaunchingWithOptions: , viewDidLoad的定义和区别
application:didFinishLaunchingWithOptions:是在应用启动并进行初始化时调用的,在此过程中会实例化根视图控制器。
viewDidLoad 在视图控制器被实例化后,视图被加载到内存中时,会调用viewDidLoad方法。
我原以为调用顺序会是这样
application:didFinishLaunchingWithOptions: ->initWithCoder -> awakeFromNib ->viewDidLoad
但是当我写了一个简单demo后说明我地猜想是错误的。
附上代码和调用结果
//ViewController.m文件下
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]){
}
NSLog(@"initWithCoder");
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
}
NSLog(@"initWithNibName");
return self;
}
- (void)awakeFromNib
{
NSLog(@"awakeFromNib");
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"viewDidLoad");
}
//AppDelegate.m文件下
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"application:didFinishLaunchingWithOptions:");
return YES;
}
最后调用的结果为
2015-09-23 00:50:42.839 Order[3848:204656] initWithCoder
2015-09-23 00:50:42.840 Order[3848:204656] awakeFromNib
2015-09-23 00:50:42.842 Order[3848:204656] application:didFinishLaunchingWithOptions:
2015-09-23 00:50:42.844 Order[3848:204656] viewDidLoad
由于我使用的时storyboard,所以调用顺序是
initWithCoder -> awakeFromNib -> application:didFinishLaunchingWithOptions: -> viewDidLoad
由于我没有学习纯代码编写界面,会的同学可以自己写一下Demo,看一下结果。