美文网首页
判断一个对象是否实现了某方法而非继承而来

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

作者: 尧月 | 来源:发表于2016-04-08 18:21 被阅读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);
    }
    

    相关文章

      网友评论

          本文标题:判断一个对象是否实现了某方法而非继承而来

          本文链接:https://www.haomeiwen.com/subject/mdbvlttx.html