CTMediator 原理详解(一)

本文深入探讨Objective-C运行时机制中的核心概念:Method、SEL和IMP。通过解析CTMediator源码,揭示了方法调用背后的秘密。Method作为方法的抽象表示,包含了SEL和IMP的映射关系。SEL作为方法的唯一标识符,用于快速查找对应方法。IMP则指向方法的实际实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

Method

先来看一下Method相关的定义

typedef struct objc_method *Method
struct 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值