iOS initWithFrame、initWithCoder、awakeFromNib的区别解析

当我们需要自定义一个View控件时,会有 initWithFrame、initWithCoder、awakeFromNib 这三个系统方法,关于这三个方法何时调用,如何调用,有时候可能很多人会弄混淆。

下面我会就理论结合代码举例来说明一下:

1、initWithFrame

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSLog(@"initWithFrame");
        [self initViews];
    }
    return self;
}

这个方法是当控件不是从xib、storyboard中创建时,会调用这个方法,比如:

 XibShow *xib = [[XibShow alloc] initWithFrame:CGRectMake(0, 330, KScreenWidth, 100)];
 [self.view addSubview:xib];

这里我直接用  [XibShow alloc] initWithFrame  来创建控件,所以,这里自定义控件内,只会走  initWithFrame 方法,其余两个不会走。

2、initWithCoder

- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        NSLog(@"initWithCoder");
        [self initViews];
    }
    return self;
}

当控件是从xib、storyboard中创建时,就会调用这个方法。

概括的理解就是:你的view或cell在xib或storyboard上有体现,比如直接用xib创建的,或是拉控件关联已有类等。

而且,即使我们自定义的view是纯代码,没有xib,但我们在vc的xib里引用了,效果是一样的。

比如,这两种方式创建的自定义view,只要我们有在xib或storyboard里引用过,就都会执行initWithCoder和awakeFromNib

3、awakeFromNib

-(void)awakeFromNib{
    NSLog(@"awakeFromNib");
    [super awakeFromNib];
    [self initViews];
}

这个方法在initWithCoder:方法后调用 ,顺序是:initWithCoder  -> awakeFromNib (下面会有代码截图)

- 可以这么来理解:

一开始经过initWithCoder创建出来的控件是死的,然后通过awakeFromNib来唤醒,所以这会有一个先后的调用顺序。

下面会有一个具体的示例:

1、创建一个vc,在storyboard上关联界面,在界面上新增一个view,关联我们的自定义view:XibShow。

2、在vc里,再额外用代码新增一个自定义view控件,add到另一个位置。

这样,运行出来的结果如下:

其中:打印顺序如上图所示。

可以发现:

1、在viewDidLoad之前,由于是storyboard上创建的类,会先执行好,且会顺序走 initWithCoder、awakeFromNib两个方法

2、到viewDidLoad之后,执行到用代码创建的view,只会走 initWithFrame 方法

PS:这里还有个小细节:我在storyboard上托控件创建的类,即使我给了背景色,但执行出来,还是以自定义view本身的背景色为准。

(可以看上图,开始设的灰色,但运行出来还是红色)

最后总结:

1、initWithFrame只适用纯代码创建时调用,不涉及xib或storyboard。

2、initWithCoder、awakeFromNib是从xib、storyboard中创建时会调用。

3、所以一般来说,为了安全起见,初始化控件的代码我们写在一个方法里面(类似我上面的initViews方法),然后我们分别在initWithFrame和initWithCoder中都调用一下,这样就保证了无论你是通过什么方式创建的控件,代码都能起到作用。

时间: 2024-12-14 03:15:55

iOS initWithFrame、initWithCoder、awakeFromNib的区别解析的相关文章

IOS开发之——四种方法解析Jason数据(转)

本文将介绍TouchJson. SBJson .JSONKit 和 iOS5所支持的原生的json方法,解析国家气象局API,TouchJson和SBJson需要下载他们的库 TouchJson包下载: http://download.csdn.net/detail/enuola/4523169 SBJson 包下载: http://download.csdn.net/detail/enuola/4523177 JSONKit包下载:http://download.csdn.net/detail

零基础iOS之Json及XML数据解析2

零基础iOS之Json及XML数据解析http://www.cnblogs.com/dingjianjaja/articles/4798604.html

ios非UTF-8格式的网页解析

网上有很多关于ios xml解析的方法,关于非UTF-8格式的网页解析也不少,我也试着看了好几个,但都没成功.今天无意中却弄好了,所以想和大家分享下.其实很简单,下面说下怎么得到非UTF-8格式的网页要解析的代码内容,这也是比较关键的一步,剩余的解析过程网上很多,这里就不在赘述了,如果实在有需要得话,再跟我联系. 1.以百度(http://www.baidu.com)为例,其网页格式为gb2312,新建一个项目project,在-(void)viewDidLoad内输入一下内容: 1NSURL

ios中@class和 #import区别

很多刚开始学习iOS开发的同学可能在看别人的代码的时候会发现有部分#import操作写在m文件中,而h文件仅仅使用@class进行声明,不禁纳闷起来,为什么不直接把#import放到h文件中呢?这 是因为h文件在修改后,所有import该h文件的所有文件必须重 新build,因此,如果把#import写在h文件中,import该h文件的文件也就会产生不必要的编译,增加编译时间,特别是在项目文件多的情况 下.想象一下,如果只是修改一个h文件而导致上百个文件不必要的编译,那是一件多么让人纠结的事情.

iOS网络数据下载和JSON解析

iOS网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍iOS中如何利用NSURLConnection如何从网络中下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载显示. 涉及到的知识点: 1.NSURLConnection异步下载和封装 #import "ZJHttpRequest.h" //消除performSelector的警告 #pragma clang diagnostic ignored "-Warc-performSelec

UIView的layoutSubviews,initWithFrame,initWithCoder方法

****************************layoutSubviews************************************ layoutSubviews是UIView中的属性方法,即只要继承于UIView,就可以使用这个方法,这个方法也很强大,以下是他的触发时机: 1.init初始化不会触发layoutSubviews  2.addSubview会触发layoutSubviews  3.设置view的Frame会触发layoutSubviews,当然前提是fra

ios 网络数据下载和JSON解析

ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载显示 涉及到得知识: 1.NSURLConnection异步下载和封装 2.JSON格式和JSON格式解析 3.数据显示和使用SDWebImage异步显示图片 内容 1.网络下载基础知识介绍 (1)什么是网络应用? 一般情况下, iPhone的计算机, 照相机不需要从网络上下载数据也能运行, 所以这

initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏

当我们创建或者自定义一个UI控件时,就很可能会调用awakeFromNib.initWithCoder .initWithFrame这些方法.三者的具体区别如下: initWithFrame: 通过代码创建UI控件的时候就会调用: initWithCoder:从文件中解析一个对象的时候就会调用这个方法,也就是说无论是通过代码还是xib,程序运行的时候都会调用这个方法: awakeFromNib:当一个对象从xib或者storyboard中加载完毕后,就会调用一次. 比如:当苹果官方提供的按钮不能

李洪强iOS开发之initWithFrame,initWithCoder和aweakFormNib

1 initWithFrame 通过代码创建控件的话用这个方法设置  2 initWithCoder(先执行) 与从xib加载有关系的 在此方法里面设置原有子控件的值是不行的,因为还没有连好线  3 aweakFormNib (后执行)方法的区别 与xib加载有关系 代表子控件从xib里面加载完成,并且,连线完成,直接可以使用 如果是从xib加载的来设置子控件的属性的话,要把代码放在aweakformNib里面