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. 手把手教你搭建Windows 搭建Prometheus + Grafana + Jmeter可视化监控平台

    下载安装包 Prometheus windows_exporter Grafana 下载地址:https://share.weiyun.com/D9sdiWoC 工作原理 Exporter 监控工具, ...

  2. No.2.6

    vw/vh:(能够使用vw单位设置网页元素的尺寸) 相对单位 相对视口的尺寸计算结果 vw:viewport width(1vw=1/100视口宽度) vh:viewport height(1vh=1 ...

  3. 面试笔记1-redis

    1.什么是RDB? RDB实际上是Redis的一种数据持久化机制.它每隔一段时间就会把内存中的数据写入到磁盘中的临时文件,作为快照,宕机重启之后,就会把rdb文件读取到内存中去,就可以恢复数据. 2. ...

  4. Vulnhub:Five86-2靶机

    kali:192.168.111.111 靶机:192.168.111.211 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --script=http-enum 192.168. ...

  5. app启动性能分析

    Activity启动流程 名词解释说明: Application OnCreate:加载第三方的sdk Activity OnCreate:加载自身的逻辑:发送远程数据请求:渲染界面List; 响应时 ...

  6. es 6中for in与for of适用对象

    在 ES6 中提供了 for-of,可以很方便的遍历数组和类数组,但是却不能遍历对象,这是为什么,与 for-in 仅仅相差一个单词,用途也是遍历,为什么却不能使用在对象上? 查资料后得知,原来 ES ...

  7. 浅谈spark

    spark spark是一个开源分布式计算框架,在于让计算更加快速,通常使用资源调度器yarn和spark自带的资源调度器standalond进行调度,spark相对于Hadoop更加快速,基于它是内 ...

  8. git---全局设置用户名、密码、邮箱

    # git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址. # 1.查看git配置信息 $ ...

  9. oracle 导出导入表 不到出指定表

    导出多个表 exp LSXYYSZHMRMS/******@PK99SERVICE file=d:\fuhcx.dmp  tables=(fhcxgxxx,fhcxjcxx,fhcxlbxx,fhcx ...

  10. Swift async await 使用介绍

    // // ViewController.swift // AsynWait // // Created by shengjie on 2022/2/9. // import UIKit class ...