iOS 面试题(iskindof)
程序员文章站
2022-04-14 22:53:22
...
这篇文章我们对面试题题目是这样的:
相关源码:
isa走位图:
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
BOOL re1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
BOOL re2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
BOOL re3 = [(id)[XZPerson class] isKindOfClass:[XZPerson class]];
BOOL re4 = [(id)[XZPerson class] isMemberOfClass:[XZPerson class]];
NSLog(@" \nre1 :%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)[XZPerson alloc] isKindOfClass:[XZPerson class]];
BOOL re8 = [(id)[XZPerson alloc] isMemberOfClass:[XZPerson class]];
NSLog(@" \nre5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);
}
return 0;
}
问这个的输出结果:
首先这个我们需要分析,这个其实主要考察的就是
- 类方法 isKindOfClass主要判断什么
- 类方法isMemberOfClass主要判断什么
- 实例方法 isKindOfClass主要判断什么
- 实例方法isMemberOfClass主要判断什么
1.首先我们来看isKindOfClass类方法源码:
// 元类 VS 类
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
//获取元类
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
元类tcls和类cls进行对比,如果不匹配会循环元类的父类和类(元类的父类可以根据isa走位图进行查看)进行对比;(元类的父类,最终会找到NSObject)
可以得出: re1 = 1 ,re3 = 0;
2.继续分析isMemberOfClass类方法
+ (BOOL)isMemberOfClass:(Class)cls {
// 元类 VS 类
return object_getClass((id)self) == cls;
}
/
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
直接就是元类和类进行对比:这样我们可以得出:re2 = 0 re4 = 0
3.继续分析isKindOfClass实例方法
- (BOOL)isKindOfClass:(Class)cls {
// 类 VS 类+ 类的父类
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
类和类以及类的父类进行循环判断我们可以得出re5 = 1 ;re7 =1;
4.继续分析isMemberOfClass实例方法
- (BOOL)isMemberOfClass:(Class)cls {
// 类 vs 类
return [self class] == cls;
}
直接就是类和类进行对比,我们可以得出re6 =1 re8 =1
综上分析我们得出 re1 = 1 ,re2 = 0 re3 = 0 re4 = 0 re5 =1 re6 =1 re7 =1 re8 =1;
打印结果为:
和我们分析的是一样的;
我们可以继续拓展一下
BOOL re9 = [(id)[NSObject class] isKindOfClass:[XZPerson class]];
BOOL re10 = [(id)[NSObject class] isMemberOfClass:[XZPerson class]];
BOOL re11 = [(id)[NSObject alloc] isKindOfClass:[XZPerson class]];
BOOL re12 = [(id)[NSObject alloc] isKindOfClass:[XZPerson class]];
NSLog(@" \nre5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re9,re10,re11,re12);
re9 ,re10,re11,re12 结果是什么呢?欢迎留言评论
下一篇: OSCache