美文网首页
CTMediator 原理详解(二)

CTMediator 原理详解(二)

作者: Lucky_Roc | 来源:发表于2019-01-08 09:51 被阅读0次

    在上一篇文章中我们大概知道了 CTMetidor 中的 NSSelectorFromStringNSClassFromStringSEL 这篇文章主要介绍一下 respondsToSelectorperformSelectorNSInvocationNSMethodSignature ,了解完这些之后对理解 CTMediator 很有帮助

    在介绍 performSelector 之前,先简单说一下RunTime吧

    RunTime

    什么是 RunTime ?

    • RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制,
      消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发

    RunTime 可以用来做什么 ?

    • 通过RunTime我们可以 让一个对象发送消息(也就是执行方法)、交换方法(Method Swizzling)、动态添加方法、给分类增加属性、字典转模型等
    // 创建person对象
    Person *p = [[Person alloc] init];
    // 调用对象方法
    [p eat];
    // 本质:让对象发送消息
    objc_msgSend(p, @selector(eat));
        
    // 调用类方法的方式:两种
    // 第一种通过类名调用
    [Person eat];
        
    // 第二种通过类对象调用
    [[Person class] eat];
    // 用类名调用类方法,底层会自动把类名转换成类对象调用
    // 本质:让类对象发送消息
    objc_msgSend([Person class], @selector(eat));
    

    respondsToSelector

    (BOOL)respondsToSelector:(SEL)aSelector;

    判断对象是否响应此方法,一般和performSelector 一起使用,防止crash

    performSelector

    CTMetidor 主要用到就是RunTime中的让对象发送消息

    performSelector 本质上就是会转化成 objc_msgSend 来进行实现,其内部实现步骤:

    RunTime
    1、通过obj的isa指针找到它的 class ;
    2、在 class 的 method list 找 eat ;
    3、如果 class 中没到 eat,继续往它的 superclass 中找 ;
    4、一旦找到 eat 这个函数,就去执行它的实现IMP 。

    来看一下 CTMetidor 的一段代码:

    [target performSelector:action withObject:params];
    

    actionSEL) 我们通过 NSSelectorFromString 获取了,target 我们通过 NSClassFromString 获取,接下来只需要通过 performSelector方法 执行 targetClass) 中的 action 即可。

    相关文章

      网友评论

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

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