我猜你需要在完成 NSLog 之后调用原始实现;如果没有,您也许可以只使用类上的类别来覆盖该方法。
要调整该方法,首先您需要一个替换方法。我通常将这样的内容放在目标类的类别中:
- (void)replacementReceiveMessage:(const struct BInstantMessage *)arg1 {
NSLog(@"arg1 is %@", arg1);
[self replacementReceiveMessage:arg1];
}
看起来它会递归地调用自身,但它不会,因为我们要交换一些东西,所以调用ReceiveMessage:
calls this调用时的方法replacementReceiveMessage:
调用旧版本。
第二步是使用运行时函数来实际执行交换。使用类别的优点是您可以使用load
在类别中进行工作:
+ (void)load {
SEL originalSelector = @selector(ReceiveMessage:);
SEL overrideSelector = @selector(replacementReceiveMessage:);
Method originalMethod = class_getInstanceMethod(self, originalSelector);
Method overrideMethod = class_getInstanceMethod(self, overrideSelector);
if (class_addMethod(self, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
class_replaceMethod(self, overrideSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, overrideMethod);
}
}
有两种情况需要处理:
- 如果我们正在调配的方法实际上是在超类中定义的,那么我们必须使用
class_addMethod
添加一个实现ReceiveMessage:
到目标类,我们使用替换实现来完成此操作。然后我们可以使用class_replaceMethod
取代replacementReceiveMessage:
有了超类的实现,所以我们的新版本将能够正确调用旧版本。
- 如果该方法是在目标类中定义的,
class_addMethod
会失败,但我们可以使用method_exchangeImplementations
只需交换新旧版本即可。