博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CTMediator 原理详解(一)
阅读量:6252 次
发布时间:2019-06-22

本文共 1130 字,大约阅读时间需要 3 分钟。

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

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

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

Method

先来看一下Method相关的定义

typedef struct objc_method *Methodstruct objc_method{    SEL method_name      OBJC2_UNAVAILABLE; // 方法名    char *method_types   OBJC2_UNAVAILABLE; // 函数的返回值和参数    IMP method_imp       OBJC2_UNAVAILABLE; // 方法的具体实现}复制代码

我们可以看到该结构体中包含一个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

转载地址:http://erysa.baihongyu.com/

你可能感兴趣的文章
删除链表的第 n 个结点
查看>>
drawable(1、canvas)
查看>>
Java过滤器,SpringMVC拦截器之间的一顺序点关系
查看>>
Git学习笔记(七)分支标签管理
查看>>
Vue学习计划基础笔记(四) - 事件处理
查看>>
python中的浅拷贝与赋值不同
查看>>
tensorflow安装
查看>>
【老叶茶馆】MySQL复制中slave延迟监控
查看>>
android onPause OnSavedInstance
查看>>
[PHP] - Laravel - CSRF token禁用方法
查看>>
python的序列类
查看>>
分享在MVC3.0中使用jQue“.NET研究”ry DataTable 插件
查看>>
使用Lombok插件需要注意的问题
查看>>
2018-2019-2 20165232 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
查看>>
Visual Studio中“后期生成事件命令行” 中使用XCopy命令
查看>>
代码导读
查看>>
Atlas读写分离[高可用]
查看>>
shell实现rpm -e 一键卸载所有相关包以及依赖
查看>>
坦克大战中摄像机的设置
查看>>
ros:出现:error: ros/ros.h: No such file or directory
查看>>