面试题答案
一键面试Method Swizzling实现方法替换的过程
- 获取类的实例方法:使用
class_getInstanceMethod
函数获取需要替换的原始方法(旧方法)和用于替换的新方法。 - 尝试交换方法实现:调用
method_exchangeImplementations
函数交换两个方法的实现。如果原始方法之前没有实现,class_addMethod
函数可能会被用于先添加方法实现。
关键的数据结构
- Class:表示类的结构,在Objective-C运行时系统中,类是一个包含了许多元数据和方法列表的结构体。每个类的实例对象的isa指针指向该类的
Class
结构体。 - Method:代表类的实例方法的数据结构,它包含了方法的名称、类型编码以及方法的实现(函数指针)。
关键函数
- class_getInstanceMethod:用于获取类的实例方法。原型为
Method class_getInstanceMethod(Class cls, SEL name)
,cls
为目标类,name
为方法的选择器(SEL)。 - method_exchangeImplementations:交换两个方法的实现。原型为
void method_exchangeImplementations(Method m1, Method m2)
,m1
和m2
为两个Method
类型的方法。 - class_addMethod:向类中添加一个实例方法。原型为
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)
,cls
是目标类,name
是方法选择器,imp
是方法的实现(函数指针),types
是方法的类型编码。