美文网首页
iOS --- class_replaceMethod

iOS --- class_replaceMethod

作者: BabyNeedCare | 来源:发表于2019-06-21 10:11 被阅读0次

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

    相关文章

      网友评论

          本文标题:iOS --- class_replaceMethod

          本文链接:https://www.haomeiwen.com/subject/nrbeqctx.html