在ObjC中捕获未定义的消息并将其转发到具有不同签名的方法

时间:2011-07-25 12:22:07

标签: objective-c objective-c-runtime

我正在用方法

编写一个记录器类(谁没有?)
- (void) logWithTag:(NSString *)aTag andMessage:(NSString *)aMsg;

我希望能够将未定义的消息转发给此方法。例如:

[myLogger logFoo:@"bar"] should call [myLogger logWithTag:@"Foo" andMessage:@"bar"]

更普遍

[myLogger logXXX:@"bar"] should call [myLogger logWithTag:@"XXX" andMessage:@"bar"]

我查看了resolveInstanceMethod和消息转发,但根据我的理解,他们都希望该方法具有相同的签名。

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

Apple在Objective-C Runtime Programming Guide中介绍了这一点。基本上你需要覆盖respondsToSelector:,如果你想支持这个方法,则返回YES。然后重写forwardInvocation:然后捕获选择器字符串,删除日志前缀,并创建一个新的NSInvocation,它将调用logWithTag:andMessage: