NSObject_IMPL 是 NSObject 类的编译后的结构体

2021-09-26 09:39:28 浏览数 (1)

  • NSObject 类被编译成了 NSObject_IMPL 的结构体。
  • Person 类被编译成了 Person_IMPL 的结构体。
  • Person 类的内部还增加了一个 NSObject_IMPL 的结构体
    • 我们知道 Person 继承于 NSObject, 所以它的底层实现中是第一个成员是父类的结构体,就是底层继承的实现方式。用这样的方式拥有父类所有的成员变量。
    • NSObject_IMPL 是 NSObject 类的编译后的结构体,它的内部只有一个 Class 类型的 isa 成员变量。我们知道 isa 是 isa_t 类型的,那为什么在这里定义成 Class 类型呢?这是为了更加直观的提现出它代表的是类的信息,所以在获取isa 的方法中,将它强制转换成了Class 类型, 代码如下:

    inline Class objc_object::ISA() {

...

return (Class)(isa.bits & ISA_MASK)

}

总结:

1.类的底层实现是结构体。

2.继承是通过把父类的结构体声明为本类结构体的第一个成员变量实现的。

isa_t 的类型

联合体: 所有成员可以是不同的类型,但是公用一块内存区域,设置了一个成员变量就会覆盖另一个成员变量的数据。优点是节省空间。

union isa_t { //联合体

isa_t() { }

isa_t(uintptr_t value) : bits(value) { }

//提供了cls 和 bits ,两者是互斥关系

Class cls;

uintptr_t bits;

#if defined(ISA_BITFIELD)

struct {

ISA_BITFIELD;  // defined in isa.h

};

#endif

};

0 人点赞