iOS 通过方法遍历调用被分类覆盖的方法

 //0 方法的数量
 unsigned int count = 0;
//1.获取类所有的属性
//:第一个参数:哪一个类  第二个参数:用于接收方法的数量的地址  返回值是一个结构体数组
Method *methodList = class_copyMethodList([Father class], &count);
//2.遍历方法数组,获取方法的详细信息
 for (int i =count - 1; i >= 0; i--) {
     Method method = methodList[i];
    
    //3.获取方法签名
    SEL sel =  method_getName(method);
    IMP imp = method_getImplementation(method);
    
    //4.获取方法名字符串
    const char *methodName = sel_getName(sel);
    
    //c字符串转成oc字符串
    NSString *methodStr = [[NSString alloc] initWithUTF8String:methodName];
    
    if([methodStr isEqualToString:@"hello"]) {
        
        //5.调用imp
        
        // 没有参数的调用
        imp();
        
        //如果方法没有传入参数时:
        void (*func)(id, SEL) = (void *)imp;
        func(self, sel);
        
        //如果方法传入一个参数时:
        void (*func1)(id, SEL,id) = (void *)imp;
        func(self, sel, param);
        
        //如果方法传入俩个参数时:
        void (*func2)(id, SEL,id,id) = (void *)imp;
        func(self, sel, param1, param2);
        
        
        break;
    }
    
}

//C对象都需要手动释放(一般带*需要释放)
free(methodList);

你可能感兴趣的:(iOS 通过方法遍历调用被分类覆盖的方法)