5

在 Objective-C 中,有没有办法设置默认处理程序以避免unrecognizedselector异常?我想做NSNULLandNSNumber来响应NSString.

谢谢!

4

3 回答 3

3

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

您可以实现methodSignatureForSelector:forwardInvocation:处理任何消息,而无需明确定义要处理的所有消息。在NSObject 类参考中阅读它们。

于 2012-11-15T04:22:23.183 回答
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
于 2012-11-15T06:01:18.807 回答
1

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

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

于 2012-11-15T04:21:21.573 回答