赞
踩
在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现。
每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的Method实现。
我们可以利用 method_exchangeImplementations 来交换2个方法中的IMP,
我们可以利用 class_replaceMethod 来修改类,
我们可以利用 method_setImplementation 来直接设置某个方法的IMP,
通过上边的方法,可以把类的调度表(dispatch table)中选择器到最终函数间的映射关系 替换。就相当于把IMP 的只想替换了。
需要统计事件,或者需要输出Log的时候,可以使用。比如在delloc中,输出log。告诉我们哪个类释放了。
+ (void)swizzWithClass:(Class)class originSel:(SEL)originSel newSel:(SEL)newSel{
Method originM = class_getInstanceMethod(class, originSel);
Method newM = class_getInstanceMethod(class, newSel);
IMP newImp = method_getImplementation(newM);
BOOL addMethodSucess = class_addMethod(class, newSel, newImp, method_getTypeEncoding(newM));
if (addMethodSucess) {
class_replaceMethod(class, originSel, newImp, method_getTypeEncoding(newM));
}else{
method_ex
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。