object_getClass(obj)与[obj class]的区别-源代码解析

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

之前写的一篇博客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]的区别的结论。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,856评论 0 9
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,242评论 0 7
  • form.StartPosition = FormStartPosition.CenterParent;
    AsaGuo阅读 406评论 0 0
  • 岸边的灯火闪烁, 天上的星辰应和, 在薄暮的清风里, 海浪拍打着渔船, 唱着自由幸福的歌。 一杯烈酒, 一碟海螺,...
    小人物眼里的世界阅读 269评论 0 6