iOS --- class_replaceMethod

2019-06-21  本文已影响0人  BabyNeedCare

遇到一个问题,要抽离原有的文件,从cocopods导入,但是有些部分调用二次封装的AFN,或者继承于NSObject的子类中的方法,例如ASubObject;

分离出库后,原有的方法在调用时,找不到类,这里有2个想法。

注意用到runtime要#import   <objc/runtime.h>

第一:分类+runtime方法交换。

第二:

class_replaceMethod([self class],NSSelectorFromString(@"swizzTest"), method_getImplementation(class_getInstanceMethod([Personclass],NSSelectorFromString(@"eat"))),"v@:");

或者,

method_setImplementation(class_getInstanceMethod([self class],NSSelectorFromString(@"swizzTest")), method_getImplementation(class_getInstanceMethod([Person class],NSSelectorFromString(@"eat"))));

假设Self class 指的是ViewController, swizzTest是里面一个方法,需要调用到库的类,注释/删除内部方法,

新建一个类,eat方法不用放在.h文件,直接实现在.m文件。

-(void)eat{

    NSLog(@"eat_person");

}

运行时会直接跑到Person类找eat方法

这个方法的优势是如果有很多控制器都引用到,集中在同一类中,方便查找。 

如果很多控制器都引用,都用第一种方法的话,需要写很多分类,不利于维护。

在runtime的概念里,一堆C的结构体和函数,对于方法,只要取到函数的指针,就可以实现自身想要的操作。(个人见解,有误请提出)

上一篇下一篇

猜你喜欢

热点阅读