美文网首页
iOS 底层 - runtime之super

iOS 底层 - runtime之super

作者: 水中的蓝天 | 来源:发表于2020-04-04 14:25 被阅读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调用当前方法的意义:表示从父类开始查找该方法的实现,正常的方法调用是从当前类开始的

    • [super message]的底层实现
      1.消息接收者仍然是子类对象
      2.从父类开始查找方法的实现

    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 内部执行逻辑

    • 先取出current_class通过class->superclass找到父类
    • 从父类缓存和方法列表开始查找方法实现,步骤和消息机制一致

    相关文章

      网友评论

          本文标题:iOS 底层 - runtime之super

          本文链接:https://www.haomeiwen.com/subject/qqmfphtx.html