美文网首页ios底层原理
CTMediator 原理详解(一)

CTMediator 原理详解(一)

作者: Lucky_Roc | 来源:发表于2019-01-07 16:13 被阅读0次

    最近开始用CTMetidor来做App模块化,顺便研究一下它的实现原理

    CTMetidor 源码中经常出现如下关键词:NSSelectorFromStringNSClassFromStringSEL 这些是个啥???

    在理解CTMediator原理之前我们先弄懂这么几个概念:

    Method

    先来看一下Method相关的定义

    typedef struct objc_method *Method
    struct objc_method{
        SEL method_name      OBJC2_UNAVAILABLE; // 方法名
        char *method_types   OBJC2_UNAVAILABLE;
        IMP method_imp       OBJC2_UNAVAILABLE; // 方法实现
    }
    
    Method结构

    我们可以看到该结构体中包含一个SELIMP,实际上相当于在SELIMP之间作了一个映射,将SELIMP进行了关联,通过SEL我们便可以找到对应的IMP,从而调用方法的实现代码。

    SEL(selector)

    • 方法编号,对方法名hash化的字符串

    • 无论什么类里,只要方法名相同,SEL就相同。项目里的所有SEL都保存在一个NSSet集合里(NSSet集合里的元素不能重复),所以查找对应方法,只要找到对应的SEL就可以了。

    既然SEL是方法的唯一标识,那不同的类调用名字相同的方法怎么办呢?

    每个方法名有对应的唯一seletor,其SEL相同,但对应的IMP函数指针不同。

    如何获取SEL?

    SEL s1  = @selector(test);
    SEL s2 = NSSelectorFromString(@“test”)
    

    以上两个方法是等价的

    IMP (implement)

    • 一个函数指针,保存了方法的地址,内部实现:
    typedef id (*IMP)(id, SEL, ...); 
    
    • 包含id(消息接受者,也就是对象),SEL(方法的名字),参数

    XX调用XXX方法,参数XX也都确定了

    执行对应的方法:

    [object test];
    // @selector(test) 是一个C的字符串
    [object performSelector:@selector(test)]];
    // 转换成如下实现方式
    objc_msgSend(object,@selector(test))
    

    总结

    • NSClassFromString 通过字符串的名称来获取一个类,可以根据Target来进行获取
    • NSSelectorFromString 通过字符串(已存在的方法名称)获取一个SEL

    相关文章

      网友评论

        本文标题:CTMediator 原理详解(一)

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