iOS 底层 - runtime之super

2020-04-04  本文已影响0人  水中的蓝天

本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢 !

super

常见的应用场景:

1. 重写初始化方法
 - (instancetype)init
{
    if (self = [super init]) {
    }
    return self;
}
2. 视图加载完毕
 - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

用super调用当前方法的意义:表示从父类开始查找该方法的实现,正常的方法调用是从当前类开始的

class方法的底层实现逻辑

伪代码
- (Class)class
{
    传入self获取当前类
    return object_getClass(self);
}

superclass的底层实现逻辑

伪代码
- (Class)superclass
{
    获取当前类,传入class_getSuperclass拿到父类
    return class_getSuperclass(object_getClass(self));
}

super 底层汇编源码

ENTRY _objc_msgSendSuper2
    UNWIND _objc_msgSendSuper2, NoFrame

    ldp p0, p16, [x0]       // p0 = real receiver, p16 = class
    ldr p16, [x16, #SUPERCLASS] // p16 = class->superclass
    CacheLookup NORMAL, _objc_msgSendSuper2

    END_ENTRY _objc_msgSendSuper2

基本逻辑解读

super 调用,底层会转换为objc_msgSendSuper2函数的调用,接收两个参数 struct objc_super2、 SEL

struct objc_super2 {
id receiver; //方法调用者
Class current_class;//当前类
}

objc_msgSendSuper2 内部执行逻辑

上一篇 下一篇

猜你喜欢

热点阅读