iOSメソッド交換

1088 ワード

クラスメソッドの交換
void SwizzleClassMethod(Class c, SEL orig, SEL new) {    
    Method origMethod = class_getClassMethod(c, orig);
    Method newMethod = class_getClassMethod(c, new);
    c = object_getClass((id)c);
    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) {
        class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    } else {
        method_exchangeImplementations(origMethod, newMethod);
    }
}

インスタンスの交換方法
void SwizzleInstanceMethod(Class c, SEL orig, SEL new) {
    Method origMethod = class_getInstanceMethod(c, orig);\
    Method newMethod = class_getInstanceMethod(c, new);\
    BOOL didAddMethod = class_addMethod(c, orig,method_getImplementation(newMethod),method_getTypeEncoding(newMethod));
    if (didAddMethod) {
        class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    } else {
        method_exchangeImplementations(origMethod, newMethod);
    }
}