我想做一些有点hacky的事。
当我们尝试在未定义的类上调用方法时,我们通常会收到错误,例如
// We get a undefined selector callback
[myClass someUndefinedMethod];
我想在MyClass
中添加一些东西来捕获所有这些未定义的方法调用并处理它。这可能吗?
我想要这样的东西,但它会拦截所有方法调用:
@implementation MyClass
- (void) performSelector(SEL):selector {
// Check if the method exists
if (![self respondsToSelector:selector]) {
// Handle unimplemeted selector
NSLog(@"No method called %@", selector);
}
// Otherwise proced as normal
else {
[super performSelector:selector];
}
}
@end
答案 0 :(得分:11)
为什么不直接覆盖NSObject上的doesNotRecognizeSelector:
方法(假设你继承了它,你应该这样做)?
答案 1 :(得分:7)
覆盖方法:
-[MyClass doesNotRecognizeSelector:]
并打电话给你想要的任何东西。
这是NSManagedObject
为获取/设置核心数据属性所做的工作。
答案 2 :(得分:1)
我不清楚你是否试图拦截发送给类或类实例的消息。在任何情况下,可能会查看/搜索“消息转发”和“转发消息”主题。另请参阅NSObject的forwardInvocation和Apple关于消息转发的运行时pgmg指南部分 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html
这些让我得到了我正在寻找的答案,我没有看到他们在这个问题的其他地方提到过。
答案 3 :(得分:0)
我猜你可以尝试为“NSObject”创建一个新类别并覆盖那样的特定方法。无论如何,请记住,Apple建议不要使用类别来覆盖方法,而是添加新功能,所以它有点hackish。但是,我不确定是否会摆脱警告......