类的内存分析 - ShenYj/ShenYj.github.io GitHub Wiki

类的内存分析

Objective-C的面向对象都是基于C/C++的数据结构实现的,所以我们可以将Objective-C代码转换成C/C++代码,来研究OC对象的本质

实例对象的本质

将一个简单的OC类转义成的C++代码

  1. 通过 C++ 代码可以看到 OC类 被编译成一个 struct

    struct OC类的类名_IMPL {
        struct NSObject_IMPL NSObject_IVARS;
        /// 如果有@perproty 属性也会有对应的成员变量, 比如: NSString *_name;
    };
  2. 继续搜索 NSObject_IMPL 的定义, 得到 NSObject_IMPL本质是一个 Class

    struct NSObject_IMPL {
        Class isa;
    };
  3. 继续搜索Class, 得到 NSObject_IMPL 本质是一个 objc_class结构体类型的指针

    typedef struct objc_class *Class;

由此可见

struct NSObject_IMPL其实就是NSObject的底层结构,或者说底层实现。换个角度理解,可以说C/C++的结构体类型支撑了OC的面相对象

  • 实例对象的本质就是一个结构体
  • 类的本质是objc_class结构类型的指针,继承自objc_object,所有的Class都是以 objc_class 为模板创建的

Object-C类的底层实现核心就是 objc_objectobjc_class

objc_object就是OC中对象object的c语言定义,可以看到对象就是一个结构体

/// Represents an instance of a class.
struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;

此结构体内有一个isa成员变量,其类型为Class。

顺便了解下OC中常用的一个通用类型id,最初写代码的时候有没有疑惑过为什么声明id类型的变量不用加上*
因为它本身就是一个指针, 是一个指向objc_object的指针。

objc_class结构体里存储了父类、方法列表等信息

Class类型其实就是指向objc_class(objc-runtime-new.h) 结构体的指针

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() const {
        return bits.data();
    }

    考虑篇幅等原因,其他静态成员变量、方法省略...
}

下一篇- objc_class

⚠️ **GitHub.com Fallback** ⚠️