我们来再看一遍题目
(注:这道题摘自于chun.tips的blog)
BOOL res1 = [(id)[NSObject class] isKindOfClass:[NSObject class]];
BOOL res2 = [(id)[NSObject class] isMemberOfClass:[NSObject class]];
BOOL res3 = [(id)[Sark class] isKindOfClass:[Sark class]];
这道题本意应该是考察对Class、MetaClass的理解,其实我觉着他更像是考isKindOfClass、isMemberOfClass的实现,挖了好大一个坑的说。
先看一下class的实现吧:
+ (Class)class {
return self;
}
即返回NSObject。
现在我们分析一下res1。看上去应该是这样的:NSObject isKindOfClass NSObject,显然res1 = YES。
(这有何难!!!)
如果你是这样理解的,那么恭喜你,掉坑里了。。。。
我们再看下isKindOfClass的实现
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
和object_getClass的实现
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
isKindOfClass先获取receiver的isa,然后再与参数进行比较。
正确的思考应该是这样的:
1.取得NSObject的isa,既meta_NSObject(我自己瞎编的名字),这个时候meta_NSObject != NSObject
2.根据源码,接下来取meta_NSObject的superClass,根据上一期的类图,即NSObject,这下NSObject == NSObject了。
3.return YES;
剩下的res2、res3同理分析一下~~~~
均为NO。
附录:
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
头一次写博客。如有错误,请指正。如有建议,请提出。如果喜欢,请关注。
网友评论