是否可以捕获所有选择器调用并在运行时重定向它们

时间:2011-12-16 12:49:50

标签: objective-c

我想做一些有点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

4 个答案:

答案 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。但是,我不确定是否会摆脱警告......