判断一个对象是否实现了某方法而非继承而来
2016-04-08 本文已影响114人
尧月
首先需要引入#import <objc/runtime.h>
- (BOOL)realRespondsToSelector:(SEL)selector
{
BOOL result = NO;
u_int count;
Method *methods= class_copyMethodList([self class], &count);
for (int i = 0; i < count ; i++)
{
SEL name = method_getName(methods[i]);
if (name == selector)
{
result = YES;
break;
}
}
if (methods != NULL)
{
free(methods);
methods = NULL;
}
return result;
}
直接使用NSObject的respondsToSelector:
是不能判断一个方法到底是自己实现的还是其父类实现的。
这里用到了runtime中的class_copyMethodList
,该方法获取到的方法列表不包括其父类的。
打印出对象所有的方法:
u_int count;
Method *methods= class_copyMethodList([self class], &count);
for (int i = 0; i < count ; i++)
{
SEL name = method_getName(methods[i]);
NSString *strName = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding];
NSLog(@"%@: %@", [self class], strName);
}