iOS--runtime / Swizzle

来源:互联网 发布:mediaworld.it 编辑:程序博客网 时间:2024/06/15 02:20

什么是 runtime

RunTimec又称运行时。就是系统在运行的时候的一些机制。

是一套底层的 C 语言 API (包含很多强大实用的 C 语言数据类型、 C 语言函数)

平时我们编写的 OC 代码,最终都是转成了底层的 runtime 代码

如:
XqPersion *persion = [XqPersion alloc] init];

[persion run];

在编译时RunTime会将上述代码转化成:

objc_msgSend(persion,@selector(run));

runtim有什么用?

能动态产生,修改,删除一个类、一个成员变量、一个方法.

能够 获得某个类内部的所有成员变量, 方法

Ivar * class_copyIvarList : 获得某个类内部的所有成员变量

Method * class_copyMethodList : 获得某个类内部的所有方法

Method class_getInstanceMethod : 获得某个实例方法(对象方法,减号 - 开头)

Method class_getClassMethod : 获得某个类方法(加号 + 开头)

method_exchangeImplementations : 交换 2 个方法的具体实现

什么是Swizzle?

在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。

利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。

每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的Method实现。

Swizzle就是在程序运行时交换两个方法的实现

0 0
原创粉丝点击