天天看点

initWithCoder, initWithNibName, viewDidLoad的区别

在学习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,看一下结果。