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 }

OC基础 - isMemberOfClass | isKindOfClass的更多相关文章

  1. 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)

    五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...

  2. OC基础回想(十二)协议

    在OC基础(十一)中我们讨论了类别和非正式协议的奇异之处.在使用非正式协议时.能够仅仅实现你想要获得响应的方法.也不必在对象中声明不论什么内容来表示该对象可用作托付对象. 全部这些任务能够用最少的代码 ...

  3. 【OC基础语法考试】

    OC基础语法已经全部学完,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.接下来我会总结前面的OC基础语法,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请 ...

  4. iOS 阶段学习第11天笔记(OC基础知识)

    iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import  用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...

  5. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  6. OC基础 文件管理

    OC基础  文件管理 1.文件管理类NSFileManager对象的创建: NSFileManager *fm = [NSFileManager defaultManager]; 2.文件操作: (1 ...

  7. OC基础 NSDate

    OC基础  NSDate #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @auto ...

  8. OC基础 NSData

    OC基础 NSData 1.NSString转NSData //NSString转NSData NSString *string = @"abcd12345"; NSData *d ...

  9. OC基础 代理和协议

    OC基础 代理和协议 1.协议 (1)oc语言中得协议:一组方法列表,不需要我们自己实现,由遵守协议的类来实现协议所定制的方法. (2)协议的使用步骤:制定协议-->遵守协议-->实现协议 ...

  10. OC基础 内存管理

    OC基础  内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free ...

随机推荐

  1. 嵌入式Linux—输入子系统

    输入系统 常见的输入设备有键盘.鼠标.遥控杆.书写板.触摸屏等等,用户通过这些输入设备与Linux系统进行数据交换. 内核中怎样表示一个输入设备 // include/linux/input.h st ...

  2. go语言环境配置(windous)

    1.下载go语言安装包:https://golang.google.cn/dl/ 2.配置环境变量:GOBIN:项目bin目录  GOPATH:项目目录(src下) GOROOT(go的环境变量) G ...

  3. 22 备份整合方案应用:Proxmox BS

    22 备份整合方案应用:Proxmox BS 22.1 深度整合备份解决方案 在PVE所内建的备份功能,当我们备份至本机路径(Directory).NFS/CIFS挂接的网路储存装置时,它每一次所做的 ...

  4. react-native-sortable-list没有渲染数据

    问题如题. 原因是我的order数组为空数组,应该将数组元素补充上.

  5. 403. 青蛙过河 (Hard)

    问题描述 403. 青蛙过河 (Hard) 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子,但是不可以跳入水中. 给你石 ...

  6. R Works with Google Earth Engine - Installation 【rgee - 安装问题解决集锦】

    Date : 2022/04/24 Intallation Tutorial - Reference : Introduction to rgee (r-project.org) Prerequisi ...

  7. 安装完IDEA后无法打开

    安装完IDEA后无法打开 一.现象 安装完IDEA2021.3版本后,无论用什么办法都无法打开 二.原因 原先有安装过idea,里面有加载过一些插件,或者是破解过,会生成一些文件,导致IDEA无法运行 ...

  8. 实验一C语言开发环境使用和数据类型·运算符·表达式

    #include<stdio.h> int main(){ printf(" o \n"); printf("<H>\n"); prin ...

  9. iOS开发 调试技巧

    1.普通断点 2.条件断点 3.全局断点 4.analyze 分析器 5.leaks 检查器 6.僵尸对象 7.lldb 命令 8.instruments 9.xcode视图调试

  10. 让自己的笔记本变wifi,如何设置呢?

    让自己的笔记本变wifi,如何设置呢?   笔记本变wifi,居然有这样的好事,没错,就是这样的,我也是才知道,哈哈.果然,世上无奇不有,只是你不知罢了.   以win10笔记本为例,亲试有效,附上链 ...