CTMediator 原理详解(二)

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

在介绍 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;spa

判断对象是否响应此方法,通常和performSelector 一块儿使用,防止crash指针

performSelector

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

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

RunTime

一、经过obj的isa指针找到它的 class ;
二、在 class 的 method list 找 eat ;
三、若是 class 中没到 eat,继续往它的 superclass 中找 ;
四、一旦找到 eat 这个函数,就去执行它的实现IMP 。

来看一下 CTMetidor 的一段代码:cdn

[target performSelector:action withObject:params];
复制代码

actionSEL) 咱们经过 NSSelectorFromString 获取了,target 咱们经过 NSClassFromString 获取,接下来只须要经过 performSelector方法 执行 targetClass) 中的 action 便可。对象

相关文章
相关标签/搜索