绕过分类,调用原类方法

345 阅读1分钟
 u_int count ;

    Method *methods = class_copyMethodList([Person class], &count);

    NSInteger indx = 0 ;

    for (int i = 0 ; i < count; i++) {

        SEL name = method_getName(methods[i]);

        NSString *selName = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding];

        NSLog(@"selName=%@",selName);

        if ([selName isEqualToString:@"print"]) {

            indx = i ;

        }

    }

    SEL sel = method_getName(methods[indx]);

    IMP imp = method_getImplementation(methods[indx]);

    ((void (*)(id,SEL))imp)(self,sel);
    //((void (*)(id,SEL))objc_msgSend)(self, selector);

第一行代码是通过方法的IMP来执行方法,

第二行代码是通过消息发送的形式objc_msgSend的方法去执行方法