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