博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
init,initialize,initWithFrame,initWithCoder,awakeFromNib等区别
阅读量:4948 次
发布时间:2019-06-11

本文共 2017 字,大约阅读时间需要 6 分钟。

1.init 与initialize

对于iOS程序,创建几个类对象,就会调用几次init。下面分别重写 举例如下:

创建一个Person类,分别重写initialize和init方法

#import "Person.h"    @implementation Person    +(void)initialize {       NSLog(@"%s", __FUNCTION__);   }    -(instancetype)init {      NSLog(@"%s", __FUNCTION__);      return  self;  }  @end

 然后创建Person类的两个对象实例

- (void)viewDidLoad {      [super viewDidLoad];            Person *p1 = [[Person alloc]init];      Person *p2 = [[Person alloc]init];    }

经过运行,我们可以看到如下结果

虽然我们创建两个实例,但是initialize仅仅被调动了一次,也可以看到,直至我们创建一个Person的实例时,initialize才被调用。

(2)拓展:

如果Person有一个子类的话,比如叫Teacher

#import "Person.h"  @interface Teacher : Person  @end  #import "Teacher.h"  @implementation Teacher    @end

注意:在Teacher的.m文件中,并没有实现initialize方法

我们同样创建Teacher类的一个实例对象

Teacher *t = [[Teacher alloc]init];

此时再次输出结果如下:

从这个结果可以看出有3个init与2个initialize,如果一个子类没有实现initialize,那么父类会调用这个方法两次,一次为自己,一次为子类。

 

2.init与initWithFrame

这是一个自定义的View

@implementation MyView- (instancetype)init {    if (self = [super init]) {        NSLog(@"调用了init");    }    return self;}- (instancetype)initWithFrame:(CGRect)frame {    if (self = [super initWithFrame:frame]) {        NSLog(@"调用了initWithFrame");    }    return self;}@end

如今我调用它的init方法

MyView *myView = [[MyView alloc] init];

结果如下:

代码的调用顺序如下:

(1)动态查找MyView的init方法

(2)调用super init方法

(3)super init方法内部执行的是[super initWithFrame:CGRectZero];

(4)然后super会发现MyView实现了initWithFrame方法

(5)转而执行 [MyView initWithFrame:CGRectZero]

(6)最后执行init其余部分

init 内部会调用父类的 initWithFrame: 方法,只不过传入的 frame 的值为0,然后父类的 initWithFrame: 方法发现当前的调用对象是子类对象,所以就调用了子类的initWithFrame方法了。这是一个多态的应用。

3.initWithFrame,initWithCoder与awakeFromNib区别

一般创建UI对象有两种方式。 一种是通过代码。 

如果是通过代码创建,那么就会调用这个方法,进行frame的部署------initWithFrame调用,

 

UIView *v= [[UIView alloc]initWithFrame:CGRectMake(0,0,Screen_Width,Screen_Heigth)];
- (id)initWithFrame:(CGRect)frame{    if (self =[superinitWithFrame:frame]) {            }    return self;}

 

一种是通过nib,通过拖拽控件模式,initWithCoder与awakeFromNib方法 首先initWithCoder  再然后- awakeFromNib唤醒这些实例对象。

 

转载于:https://www.cnblogs.com/guohai-stronger/p/8119104.html

你可能感兴趣的文章