美文网首页
object_getClass(obj)与[obj class]

object_getClass(obj)与[obj class]

作者: IcebergHorseman | 来源:发表于2016-01-08 20:55 被阅读249次

浮于表面探究问题不失为一种方法,但是弄清楚本质才是真正意义上的解决疑惑。

之前写的一篇博客object_getClass(obj)与[obj class]的区别,通过代码测试探索object_getClass(obj)与[obj class]的区别,虽然大概知道了二者区别,且在使用上能够区分开来,但是现在看来有点劳神费力,不知其所以然。

最近开始在阅读object-runtime的源代码,看了object_getClass(obj)与[obj class]的代码实现后,一目了然。

object_getClass(obj)的代码实现:

Class object_getClass(id obj)
{
    return _object_getClass(obj);
}

其中_object_getClass(obj)是一个静态内联函数,代码实现如下:

static inline Class _object_getClass(id obj)
{
    #if SUPPORT_TAGGED_POINTERS
    if (OBJC_IS_TAGGED_PTR(obj)) {
        uint8_t slotNumber = ((uint8_t) (uint64_t) obj) & 0x0F;
        Class isa = _objc_tagged_isa_table[slotNumber];
        return isa;
    }
    #endif
      if (obj) return obj->isa;
      else return Nil;
  }

简单的说_object_getClass函数就是返回对象的isa指针。

[obj class]的代码实现分两种情况,分别是obj为实例对象和类对象,代码如下所示:

//类方法直接返回自身指针
+ (Class)class {
    return self;
}

 //实例方法调用object_getClass,返回isa指针
- (Class)class {
    return object_getClass(self);
}

通过上面代码可以看出,调用[obj class],不管obj对实例对象还是类对象,结果都是一样的。这也验证了之前写的一篇博客object_getClass(obj)与[obj class]的区别的结论。

通过查看源代码,不仅理解上更深刻,而且不必写过多的测试代码,事半功倍。

相关文章

网友评论

      本文标题:object_getClass(obj)与[obj class]

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