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. ACR20新闻_RA指南更新_最大化应用MTX

    美国风湿病学院(ACR)学术年会2020新闻 译自Medscape官网 https://www.medscape.com/viewarticle/940636#vp_1 (注: 译文借助谷歌翻译助手, ...

  2. Prometheus插件安装(mysql_exporter)

    Prometheus插件安装(mysql_exporter) 简介 mysql_exporter是用来收集MysQL或者Mariadb数据库相关指标的,mysql_exporter需要连接到数据库并有 ...

  3. pytorch学习笔记五之通过示例学习

    1.概述¶   PyTorch 的核心是提供两个主要功能: n 维张量,类似于 NumPy,但可以在 GPU 上运行 用于构建和训练神经网络的自动微分   我们将使用将三阶多项式拟合y = sin(x ...

  4. 干货!超实用的 Linux 初始化脚本

    咸鱼今天给大家分享一个无论是学习还是工作中都很实用的 Linux 系统初始化脚本,其实就是各种命令的集合 完整代码在文章最后哦 定义相关变量   配置 yum 镜像源 获取阿里云 yum 镜像源 判断 ...

  5. ChatGPT Java客户端,OpenAi的Java版本SDK已完成,请火速接入。

    已经支持OpenAI官方的全部api,有bug欢迎朋友们指出,互相学习. 源码地址:https://github.com/Grt1228/chatgpt-java 不对之处欢迎指正. 注意:由于这个接 ...

  6. 自我生啃 AMBA AXI 总线笔记

    视频1:https://www.youtube.com/watch?v=1zw1HBsjDH8&list=PLkqJVNOiuuHtNrVaNK4O1BSgczja4obeW (What is ...

  7. C# DevExpress GridControl中BandedGridView表格使用

    1.设计器方式创建 1.点击"Change view">>然后在选中"Convert to"选项>>最后选中点击"Banded ...

  8. vue 项目配置自动打压缩包

    vue cli3 创建的项目 1.安装包 npm install filemanager-webpack-plugin --save-dev npm install silly-datetime -- ...

  9. ant design vue datePicker 日期时间范围设置默认为当天0点-23点59

    <template> <a-card :bordered="false"> <a-range-picker show-time :default-va ...

  10. python-异常/文件/时间/随机数

    python-异常/文件/时间/随机数 def exception_test(): try: x = float(input("请输入被除数:")) y = float(input ...