在Objective-C中,有没有办法设置默认处理程序以避免unrecognizedselector
异常?我想让NSNULL
和NSNumber
回复NSString
中的所有方法。
谢谢!
答案 0 :(得分:3)
您可以使用类别向NSNull
和NSNumber
类添加方法。阅读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,并且当对象没有与某个给定选择器匹配的方法时调用它。