initWithCoder, initWithNibName, viewDidLoad的区别

本文解析了iOS视图控制器的初始化过程,包括initWithCoder、awakeFromNib与viewDidLoad等方法的作用及调用时机,并通过实验验证了实际调用顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值