CTMediator 原理详解(二)

在上一篇文章中我们大概知道了 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 即可。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,839评论 0 9
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 6,593评论 0 7
  • 继上Runtime梳理(四) 通过前面的学习,我们了解到Objective-C的动态特性:Objective-C不...
    小名一峰阅读 4,117评论 0 3
  • Runtime是一套比较底层的纯C语言API,包含了很多底层的C语言API。在我们平时编写的OC代码中,程序运行时...
    这个年纪的情愫丶阅读 3,793评论 5 3
  • 三月,莺飞草长。 你飞去天空蓝的通透的大理。骑行环洱海,抬头见雪山。 认识一群有趣的人,拍了最中意的照片。 开始第...
    侠女小艾阅读 754评论 0 0