isMemberOfClass | isKindOfClass

1 - 猜想以下代码输出的结果

 1 #import <Foundation/Foundation.h>
2 #import <objc/runtime.h>
3 @interface Person : NSObject
4
5 @end
6 @implementation Person
7
8 @end
9
10 int main(int argc, const char * argv[]) {
11 @autoreleasepool {
12
13 NSLog(@"%d", [[NSObject class] isKindOfClass:[NSObject class]]);
14 NSLog(@"%d", [[NSObject class] isMemberOfClass:[NSObject class]]);
15 NSLog(@"%d", [[Person class] isKindOfClass:[Person class]]);
16 NSLog(@"%d", [[Person class] isMemberOfClass:[Person class]]);
17
18 NSLog(@"========== 以上代码等价如下 =========");
19
20 NSLog(@"%d", [NSObject isKindOfClass:[NSObject class]]);
21 NSLog(@"%d", [NSObject isMemberOfClass:[NSObject class]]);
22 NSLog(@"%d", [Person isKindOfClass:[Person class]]);
23 NSLog(@"%d", [Person isMemberOfClass:[Person class]]);
24
25 }
26 return 0;
27 }

日志信息

2 - isMemberOfClass 和 isKindOfClass 源代码

 1 - (BOOL)isMemberOfClass:(Class)cls {
2 return [self class] == cls;
3 }
4 - (BOOL)isKindOfClass:(Class)cls {
5 for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
6 if (tcls == cls) return YES;
7 }
8 return NO;
9 }
10
11
12 + (BOOL)isMemberOfClass:(Class)cls {
13 return object_getClass((id)self) == cls;
14 }
15
16
17 + (BOOL)isKindOfClass:(Class)cls {
18 for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
19 if (tcls == cls) return YES;
20 }
21 return NO;
22 }

结论:isMemberOfClass  左边对象(类对象)是否等于右边所传进的类对象,是相等的关系

isKindOfClass 左边对象(类对象)是否等于右边所传进的类对象或是其子对象,是相等或是其子对象的关系

3 - 代码实例

 1 #import <Foundation/Foundation.h>
2 #import <objc/runtime.h>
3 @interface Person : NSObject
4
5 @end
6 @implementation Person
7
8 @end
9
10 int main(int argc, const char * argv[]) {
11 @autoreleasepool {
12
13 // ----------------------------类方法
14 NSLog(@"%d", [Person isMemberOfClass:object_getClass([Person class])]); // 1
15
16 // NSObject
17 NSLog(@"%d", [Person isKindOfClass:object_getClass([NSObject class])]); // 1
18 NSLog(@"%d", [Person isKindOfClass:[NSObject class]]);// 1
19
20 // ----------------------------实例方法
21 id person = [[Person alloc] init];
22
23 NSLog(@"%d", [person isMemberOfClass:[Person class]]); // 1
24 NSLog(@"%d", [person isMemberOfClass:[NSObject class]]); // 0
25 NSLog(@"%d", [person isKindOfClass:[Person class]]); // 1
26 NSLog(@"%d", [person isKindOfClass:[NSObject class]]); // 1
27
28 }
29 return 0;
30 }

最新文章

  1. android 布局学习
  2. service XXX does not support chkconfig
  3. Java多线程与并发库高级应用-工具类介绍
  4. html5 canvas(小树姐的牛掰到爆了的作品)
  5. jsp数据库连接出现乱码
  6. PacBio软件总览 - 初级分析
  7. C++实现RTMP协议发送H.264编码及AAC编码的音视频(转)
  8. java EE 学习
  9. phpcms v9 数据库分离部署
  10. MVC中修改报错
  11. ViewState是什么
  12. QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址
  13. 【实验吧】逆向rev50
  14. Borůvka algorithm
  15. Ubuntu宿主机与VMware中其他系统虚拟机的互通
  16. HTTP和RFC
  17. 让AI简单且强大:深度学习引擎OneFlow技术实践
  18. vue源码逐行注释分析+40多m的vue源码程序流程图思维导图 (diff部分待后续更新)
  19. bzoj3730 震波 [动态点分治,树状数组]
  20. Spring 面试问题 TOP 50

热门文章

  1. .gitattributes 作用详细讲解
  2. Linux操作命令(九)1.comm命令 2.diff命令 3.patch命令
  3. rotate matrix
  4. JOI 公園 (JOI Park)
  5. 2.4 在DispatcherServlet的service方法中,通过ServletPath获取对应的Controller对象
  6. pictrue类的练习
  7. 提升IIS权限
  8. HttpClient 提交 JSON数据
  9. C++实现顺序栈相关操作代码
  10. 1970:【15NOIP普及组】扫雷游戏