cocoa_chen

用runtime判断对象是否实现了父类的方法

2014-11-05

前两天朋友问了个问题,如何判断一个方法是由这个对象自己实现了,还是直接继承的父类实现。看了下,用respondsToSelector是无法判断出来的,需要用到runtime的东西。所以又顺便看了下runtime的东西并在此记录一下。

1.class_copyMethodList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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;
}

2.class_addMethod

同样,使用class_addMethod也可以判断出来。如果子类覆写了父类的方法,class_addMethod会fail,如果没实现的话会返回yes。

总结

runtime是Objective-C最强大也是最核心的东西,让我们可以在运行时做很多事情。了解并掌握runtime也是Objective-C学习路上的重中之重。回头自己要好好整理整理runtime相关的东西,感兴趣的也可以自己去搜一搜相关的文章和博客,相信看完会对你有很大的帮助。

Tags: iOS
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章