遇到一个问题,要抽离原有的文件,从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的结构体和函数,对于方法,只要取到函数的指针,就可以实现自身想要的操作。(个人见解,有误请提出)
网友评论