CTMediator 原理详解(二)

栏目: IOS · 发布时间: 7年前

内容简介:在上一篇文章中我们大概知道了在介绍(BOOL)respondsToSelector:(SEL)aSelector;

在上一篇文章中我们大概知道了 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 来进行实现,其内部实现步骤:

CTMediator 原理详解(二)

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 即可。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Mechanics of Web Handling

The Mechanics of Web Handling

David R. Roisum

This unique book covers many aspects of web handling for manufacturing, converting, and printing. The book is applicable to any web including paper, film, foil, nonwovens, and textiles. The Mech......一起来看看 《The Mechanics of Web Handling》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具