天天看點

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);

}