init和initWithFram调用的先后顺序(iOS)

自定义了一个view,实现了init方法和initWithFram方法;

@implementation SHHShopView

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"init");
    }
    return self;
}

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

@end

调用 SHHShopView *shopView = [[SHHShopView alloc] init]; 的时候控制台会打印如下结果:


调用init方法

直接调用 initWithFram: 方法时,控制台打印结果如下:


调用initWithFram:方法
通过打断点,可以知道代码的调用顺序如下:

1、先进入init方法
2、然后调用 [super init] 方法
3、[super init] 方法中会自动调用 [super initWithFrame:CGRectZero] 方法
4、然后super会发现自定义的view中实现了 initWithFram: 方法,转而调用自定义的 initWithFram: 方法
5、最后会调用init方法中的其他部分

关键点:OC 里面的 super 实际上是让某个类自己去调用父类的方法, 而不是父类去调用某方法。方法动态调用过程中的顺序是按照继承关系从下到上
所以在以后的自定义控件的时候,可以直接重写 initWithFram: 方法。当使用init方法的时候也会调用 initWithFram: 方法

你可能感兴趣的:(init和initWithFram调用的先后顺序(iOS))