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

首先需要引入#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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,838评论 0 9
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,237评论 0 7
  • 原文出处:南峰子的技术博客 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了...
    _烩面_阅读 1,305评论 1 5
  • Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理。这种动态语言的...
    有一种再见叫青春阅读 623评论 0 3
  • 基本上最近新出的智能机都要配备着“指纹解锁”的功能,仿佛有了”指纹解锁“这一功能才够资格称得上是智能机。自从苹果5...
    方方方小只阅读 599评论 0 0