美文网首页iOS 开发 iOS Developer
做题系列之2---系列1中遗留的问题

做题系列之2---系列1中遗留的问题

作者: 08878f627e79 | 来源:发表于2016-03-30 15:41 被阅读567次

    我们来再看一遍题目
    (注:这道题摘自于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;
    }
    

    头一次写博客。如有错误,请指正。如有建议,请提出。如果喜欢,请关注。

    相关文章

      网友评论

        本文标题:做题系列之2---系列1中遗留的问题

        本文链接:https://www.haomeiwen.com/subject/guxelttx.html