为“无法识别的选择器”异常设置默认处理程序

时间:2012-11-15 04:02:50

标签: objective-c cocoa nsstring unrecognized-selector

在Objective-C中,有没有办法设置默认处理程序以避免unrecognizedselector异常?我想让NSNULLNSNumber回复NSString中的所有方法。

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用类别向NSNullNSNumber类添加方法。阅读The Objective-C Programming Language中的类别。

您可以实现methodSignatureForSelector:forwardInvocation:来处理任何消息,而无需明确定义您要处理的所有消息。在NSObject Class Reference中了解它们。

答案 1 :(得分:3)

要处理“无法识别的选择器”异常,我们应该覆盖两个方法:

- (void)forwardInvocation:(NSInvocation *)anInvocation;
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector;

在这种情况下,如果我们希望NSNull在发生“无法识别的选择器”异常时执行NSSString方法,我们应该这样做:

@interface NSNull (InternalNullExtention)
@end



@implementation NSNull (InternalNullExtention)

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
    NSMethodSignature* signature = [super methodSignatureForSelector:selector];
    if (!signature) {
        signature = [@"" methodSignatureForSelector:selector];
    }
    return signature;
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    SEL aSelector = [anInvocation selector];

    if ([@"" respondsToSelector:aSelector])
        [anInvocation invokeWithTarget:@""];
    else
        [self doesNotRecognizeSelector:aSelector];
}
@end

答案 2 :(得分:1)

有。查看forwardInvocation的示例:在NSObject的文档中: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

基本上,您覆盖forwardInvocation,并且当对象没有与某个给定选择器匹配的方法时调用它。