1.oc中的内省方法
//类调用
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = self->ISA(); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
//对象调用
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
//类调用
+ (BOOL)isMemberOfClass:(Class)cls {
return self->ISA() == cls;
}
//对象调用
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
结合面试提分析结果
//面试题
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
BOOL re3 = [(id)[LGPerson class] isKindOfClass:[LGPerson class]];
BOOL re4 = [(id)[LGPerson class] isMemberOfClass:[LGPerson class]];
NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4);
BOOL re5 = [(id)[NSObject alloc] isKindOfClass:[NSObject class]];
BOOL re6 = [(id)[NSObject alloc] isMemberOfClass:[NSObject class]];
BOOL re7 = [(id)[LGPerson alloc] isKindOfClass:[LGPerson class]];
BOOL re8 = [(id)[LGPerson alloc] isMemberOfClass:[LGPerson class]];
NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
//打印结果为
re1 :1
re2 :0
re3 :0
re4 :0
re5 :1
re6 :1
re7 :1
re8 :1
问题 1. [(id)[NSObject class] isKindOfClass:[NSObject class]] 的打印结果为 1 ?
- 首先 [NSObject class] 调用 +isKindOfClass 第一步 cls 是 NSObject , 根据 tcls=self->ISA() 得到 NSObject元类 ,此时 tcls != cls 循环继续, 更新 tcls = tcls->superclass , NSObject元类 的父类正好是 NSObject 正好满足 tcls == cls 所以返回 YES 打印结果为 1
问题2. [(id)[NSObject class] isMemberOfClass:[NSObject class]] 的结果为 0 ?
- 首先 [NSObject class] 调用 + isMemberOfClass 第一步 cls 是 NSObject , self->ISA()所以应该是NSObject元类 ,此时 NSObject 不等于 NSObject元类 所以返回 NO 打印结果为 0
问题3. [(id)[LGPerson class] isKindOfClass:[LGPerson class]] 的结果为 0 ?
- 首先 [LGPerson class] 调用 + isKindOfClass 第一步 cls 是 LGPerson , tcls = self->ISA()所以应该是LGPerson元类 ,此时 LGPerson 不等于 LGPerson元类 继续更新 tcls = tcls->superclass 此时 tcls 是 NSObject元类 对比一下也不相等,再继续更新 tcls 是 NSObject 当然 LGPerson != NSObject 直到 superclass = nil 不满足循环条件 return NO 所以打印结果为 0
问题4. [(id)[LGPerson class] isMemberOfClass:[LGPerson class]] 的结果为 0 ?
- 首先 cls 是 LGPerson , self->ISA()所以应该是LGPerson元类 ,此时两个结果不相等所以返回 NO 打印结果为 0
问题6 和 8 都是调用 - isMemberOfClass 实例方法, 对应源码应该[self class] == cls 很好理解,都是返回 1
问题 5 和 7 都是调用 - isKindOfClass 实例方法, cls 是当前类 tcls = [self class] 得到的结果也是当前类, 所以判断都是相等的结果打印为 1
网友评论