美文网首页
Runtime之强行调用被覆盖类中的方法

Runtime之强行调用被覆盖类中的方法

作者: wangDavid939i | 来源:发表于2019-03-13 10:43 被阅读0次
1.关于类别覆盖原有类方法后,我们任然要想调用其原有类的方法。所用的底层转换方式

#import <Foundation/Foundation.h>
#import "CFRuntimeKit.h"
#import "CFPerson.h"
#import "CFPerson+Category1.h"
#import "CFPerson+Category2.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        CFPerson *person = [[CFPerson alloc]init];
        //方法覆盖问题验证(后面编译的分类方法在最前面,优先访问它)
        [person eating];
        //查看方法列表
        NSArray *methodArr = [CFRuntimeKit fetchMethodList:[CFPerson class]];
        NSLog(@"methodArr:%@",methodArr);
        
        /*
         *调用person类的eating方法
         */
        unsigned int outCount = 0;
        Method *methodList = class_copyMethodList([CFPerson class], &outCount);
        IMP lastImp = NULL;
        SEL lastSel = NULL;
        for (unsigned int i=0; i<outCount; i++) {
            Method method = methodList[i];
            SEL methodSEL = method_getName(method);
            NSString *methodName =[NSString stringWithUTF8String:sel_getName(methodSEL)];
            if ([methodName isEqualToString:@"eating"]) {
                lastImp = method_getImplementation(method);
                lastSel = method_getName(method);
            }
        }
        ((void (*)(id,SEL))(void *)lastImp)(person,lastSel);
        free(methodList);
    }
    
    return 0;
}

相关文章

  • Runtime之强行调用被覆盖类中的方法

    1.关于类别覆盖原有类方法后,我们任然要想调用其原有类的方法。所用的底层转换方式

  • iOS load和initialize的调用次序和区别

    load 当类或分类被加载到runtime时被调用,且每个类或分类只会调用一次load方法,子类不会覆盖父类,分类...

  • Python调用父类中的方法和super()的用途

    直接调用父类的super方法 调用父类的init()方法,确保父类被正确初始化 当覆盖了python中的特殊方法时

  • 继承

    super() 用于调用父类的构造方法 this() 用于调用本类中的构造方法 覆盖 覆盖父类的方法 应保持与...

  • load和initialize

    +load方法是一定会在runtime中被调用的,只要类被添加到runtime中了,就会调用+load方法。只要是...

  • JavaScript零散知识点

    继承 super 在子类中调用super,会调用父类的方法; 不用super,则会覆盖父类的方法。调用本类中的方法。

  • OC -> Runtime

    Runtime简介 Runtime用处 Runtime实践 Runtime 类方法调用实现。Person * p ...

  • iOS load方法的调用时机

    load方法的调用时机 当类或类别加载到Runtime中时将会调用load方法,也就是说当类被引入进项目时会调用l...

  • iOS开发之+load与+initialize

    一、+load +load方法是一定会在runtime中被调用的,只要类被添加到runtime中了,就会调用+lo...

  • +load和+initialize

    一、load +load方法是一定会在runtime中被调用的,只要类被添加到runtime中了,就会调用+loa...

网友评论

      本文标题:Runtime之强行调用被覆盖类中的方法

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