天天看点

iOS Categroy触类旁通-category和方法覆盖

我们已经知道category其实并不是完全替换掉原来类的同名方法,只是category在方法列表的前面而已,所以我们只要顺着方法列表找到最后一个对应名字的方法,就可以调用原来类的方法:

Class currentClass = [MyClass class];

MyClass *my = [[MyClass alloc] init];

if (currentClass) {

    unsigned int methodCount;

    Method *methodList = class_copyMethodList(currentClass, &methodCount);

    IMP lastImp = NULL;

    SEL lastSel = NULL;

    for (NSInteger i = 0; i < methodCount; i++) {

        Method method = methodList[i];

        NSString *methodName = [NSString stringWithCString:sel_getName(method_getName(method))

                                        encoding:NSUTF8StringEncoding];

        if ([@"printName" isEqualToString:methodName]) {

            lastImp = method_getImplementation(method);

            lastSel = method_getName(method);

        }

    }

    typedef void (*fn)(id,SEL);

    if (lastImp != NULL) {

        fn f = (fn)lastImp;

        f(my,lastSel);

    }

    free(methodList);

}