判断一个对象是否实现了某方法而非继承而来

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);
}
上一篇下一篇

猜你喜欢

热点阅读