UIView的init调用

UIView的init调用

在这里着重写 UITableViewCell 的init

首先讲个背景:

SettingCell继承BaseCell,而BaseCell继承UITableViewCell

1、[[SettingCell alloc] init];

调用顺序:

  1. 首先调用 SettingCell.m 文件里的 init 函数,此时打印out self~~~~~~~~~~~~SettingCell

  2. 再调用 BaseCell.m 文件里的 init 函数,此时打印out self~~~~~~~~~~~~SettingCell

  3. 然后会调用底层父类UITableView的 init 函数

    pic mark


    其实到这里是一个小的阶段,上面的阶段一调用时各层的 init 函数下面继续



  4. 之后会调用 SettingCell.m 文件里的 initWithFrame 函数,此时打印out self~~~~~~~~~~~~SettingCell
  5. 再调用 BaseCell.m 文件里的 initWithFrame 函数,此时打印out self~~~~~~~~~~~~SettingCell
  6. 然后会调用底层父类UITableView的 initWithFrame 函数

    pic mark


    到这里是一个另外的一个小的阶段,这个阶段二调用的是各层的 initWithFrame 函数,下面继续



  7. 再调用 SettingCell.m 文件里的 initWithStyle函数,此时打印out self~~~~~~~~~~~~SettingCell
  8. 调用 BaseCell.m 文件里的 initWithStyle 函数,此时打印out self~~~~~~~~~~~~SettingCell

    pic mark


    注意:这里到底是否调用了UITableView的 initWithStyle 函数了???(按理说应该要调用,但是没有看到线程)


到这里已经到达BaseCell.m 文件里的if(self)函数里面了,打印的是 in self~~~~~~~~~~~~SettingCell

然后就开始出各层的函数了 按照上面进入函数的顺序(类似于栈,先进后出),逆序出函数

out 和 in 打印的个数一一对应,打印了6个

pic mark

out 个数:和in 个数相同

  1. SettingCell 的 init 函数
  2. BaseCell 的 init 函数
  3. SettingCell 的 initWithFrame 函数
  4. BaseCell 的 initWithFrame 函数
  5. SettingCell 的 initWithStyle 函数
  6. BaseCell 的 initWithStyle 函数

2、[[SettingCell alloc] initWithFrame:]

在initWithFrame的初始化过程中,打印了4个out,道理很简单,第一个阶段的init舍去了

3、[[SettingCell alloc] initWithStyle:]

在initWithStyle的初始化过程中,打印了2个out,舍去了第一个阶段的init和第二个阶段的initWithFrame

4、[[NSBundle mainBundle] loadNibNamed:@”SettingCell”…]

在用xib初始化的过程中,打印了2个out,直接进入了initWithCoder函数里,一层层的往里进入,最后出来

pic mark

5、总结

在init的过程中,会一层层的往里进入(其他的View是不是这样可以自行验证),然后再一层层出来,像栈那样先入后出,最后调用完毕

关于每次打印都是SettingCell问题:

这个不会因为进入到哪个类的函数中,调用的self.class就变成了这个类,而是最开始调用它的主体是谁,那么以后调用 父类 和 子类 的实体都还是这个主体对象,所以打印的一直是SettingCell

6、代码(O(∩_∩)O哈哈~)

只写了一部分,自己创建两个类,一个父类(BaseCell)和一个子类(SettingCell),然后在.m文件里copy如下代码,就可以验证啦 == (*^__^*) 嘻嘻……

- (instancetype)initWithCoder:(NSCoder *)coder
{
    NSLog(@"out self~~~~~~~~~~~~%@",self.class);


    self = [super initWithCoder:coder];

    if (self) {

        self.selectedBackgroundView = [[UIView alloc] init];

        NSLog(@"in self~~~~~~~~~~~~%@",self.class);
    }
    return self;
}


- (instancetype)initWithFrame:(CGRect)frame
{
    NSLog(@"out self~~~~~~~~~~~~%@",self.class);

    self = [super initWithFrame:frame];

    if (self) {

        self.selectedBackgroundView = [[UIView alloc] init];

        NSLog(@"in self~~~~~~~~~~~~%@",self.class);
    }
    return self;
}

- (instancetype)init
{
    NSLog(@"out self~~~~~~~~~~~~%@",self.class);

    self = [super init];

    if (self) {

        self.selectedBackgroundView = [[UIView alloc] init];

        NSLog(@"in self~~~~~~~~~~~~%@",self.class);

    }
    return self;
}

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    NSLog(@"out self~~~~~~~~~~~~%@",self.class);

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {

        self.selectedBackgroundView = [[UIView alloc] init];

        NSLog(@"in self~~~~~~~~~~~~%@",self.class);
    }
    return self;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值