提供一个解决unrecognized selector错误的宏定义,所有类都不会触发unrecognized selector错误 —

来源:互联网 发布:php手机网页游戏源码 编辑:程序博客网 时间:2024/05/14 02:45

Unrecognized selector

在调用performSelector时如果忘记了检查selector是否存在(respondsToSelector),则很容易造成unrecognized selector exception, 这里提供一个简单方便的方案解决unrecognized selector报错的问题



NSObject+NoUnrecognizedSelector.h

#import <Foundation/Foundation.h>@interface NSObject (NoUnrecognizedSelector)@end

NSObject+NoUnrecognizedSelector.m

#import "NSObject+NoUnrecognizedSelector.h"#import <objc/runtime.h>@implementation NSObject (NoUnrecognizedSelector)-(id)emptyMethod:(SEL) sel {    printf("unrecoginzed selector occurs!(class = %s, method = %s)\n\n", class_getName([self class]), sel_getName(sel));    return nil;}- (void)forwardInvocation:(NSInvocation *)anInvocation {    if (![self respondsToSelector:anInvocation.selector]) {        SEL sel = [anInvocation selector];        anInvocation.selector = @selector(emptyMethod:);        [anInvocation setArgument:&sel atIndex:2];        [anInvocation invoke];    }}- (id)forwardingTargetForSelector:(SEL)aSelector {    return self;}- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {    NSMethodSignature * signature = nil;    Class actualClass = object_getClass(self);    Method method = class_getInstanceMethod(actualClass, aSelector);    if (method) {char const *encoding = method_getTypeEncoding(method);signature = [NSMethodSignature signatureWithObjCTypes:encoding];    } else {        method = class_getClassMethod(actualClass, aSelector);    }    if (method) {        char const *encoding = method_getTypeEncoding(method);signature = [NSMethodSignature signatureWithObjCTypes:encoding];    } else {        signature = [self methodSignatureForSelector:@selector(emptyMethod:)];    }    return signature;}@end



0 0
原创粉丝点击