架构师之路iOS面试题iOS 进阶

Runtime源码阅读分享之对象的本质,了解isa

2018-04-11  本文已影响167人  __silhouette
image

引言

我们都知道,Runtime 是 Objective-C 这门动态语言的核心,只有理解了它,我们才能够更好的理解 Objective-C 到底是如何工作的,在编程时,也会更加得心应手。由于时间和精力有限,此次我主要想从以下几方面来进行 Runtime 源码的阅读,日后将会逐步完善。由于总体篇幅较长,所以我将会每一部分拆分成一篇文章来具体分析。

目录

一、对象的本质,了解 isa

二、对象的生命周期

三、对象的引用计数

四、对象的扩展方法

五、Runtime 的应用

对象的本质,了解 isa

首先来看一看对象和类的定义

/// Represents an instance of a class.
struct objc_object {
private:
    isa_t isa;

public:
    // ISA() assumes this is NOT a tagged pointer object
    Class ISA();
};


// 其内部有一个指向 Class 的指针,而 Class 是什么呢

// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

// 再来看一下  objc_class 的定义,需要注意的是,objc_class 也是继承自 objc_object, 由于 objc_object 中已经定义了一个 isa 指针,由于结构体中所有的成员都是 public 的,所以 objc_class 也就拥有了 isa 并且也拥有访问 isa 的权限。
struct objc_class : objc_object {
    // Class ISA;   // 此时,类中的 isa 指针指向的是 metaClass 元类
    Class superclass;  // 父类
    cache_t cache;             // formerly cache pointer and vtable 类的方法缓存,因为 Runtime 时会把第一次遇到的方法缓存到方法缓存中,此后将直接从缓存中读取方法,极大提高了效率
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags
  //  class_data_bits_t <==> class_rw_t + 一个 rr/alloc 位
};

所以到这里,我们也就理解到了,实际上,类也是一个对象

此时,经过 Runtime 的作用之后,现在内存中的关系是,类中的 data 指针指向 class_data_bits_t, class_data_bits_t 结构体中的 data() 方法获取到的是 class_rw_t 指针, class_rw_t 结构体中的 ro 指针指向 class_ro_t。图如下:

图片来自一位大神的博客,侵权删

现在,我们的重点终于到了, isa 到底是什么?

![image](http://upload-images.jianshu.io/upload_images/3262069-f3a02c34c16975e6?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

至此,也就证明了我们之前对于初始化 `isa` 时对 `initIsa` 方法的分析是正确的。它设置了 `indexed`、`magic` 以及 `shiftcls`。

获取 isa

总结

参考资料

上一篇下一篇

猜你喜欢

热点阅读