objc_msgSendSuper 理解

刨根问底Objective-C Runtime

  super 调用 objc_msgSendSuper 告诉系统
去父类方法列表里面去找,但是调用者主体还是 self
和 self 的区别只是不在本类 的方法列表中查找

经常写的代码 如下

- (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        count = 0;
        NSLog(@"%@",NSStringFromClass([self class]));
        NSLog(@"%@",NSStringFromClass([super class]));

    }
    return self;
}

super 的含义,消息转发会调用 objc_msgSendSuper, 就是 去父类的方法列表中找到 initWithFrame:这个方法,然后调用,调用的主体是 self。super 只是一个编译器的特殊字符,并不代表父类的一个实例化对象。这也就能明白为什么 调用 [super initWithFrame:frame]能得到本类的 实例化对象了,而不是父类的对象了。
[self class] [super class]class 这个方法都是 在 NSObject 对象中找到的,所以 都相当于 调用 [self class], 输入都是 一样的 SubView

你可能感兴趣的:(objc_msgSendSuper 理解)