@
coa 我来总结一下,大神看看对不对。
现在我们涉及到 objc_object , objc_class , isa , meta-class , class_t , NSObject 这几个。
objc_object 其实就是我们常见的 id 在 C 语言中的表示, objc_object 结构体中的 isa 指向 objc_class , objc_class 中的 isa 指向 meta-class 。
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
这个是 objc.h 中 objc_class 的定义。这样说 meta-class 也是一个 objc_class 。
class_t 这里就这样理解:其实每个对象和类,在 runtime 中都对应一个结构体,而生成这样的结构体需要一个‘模版’(这里解释了文中‘基于’的意思)。
结合网上流传的这张图。这里的 instance of subclass 对应 objc_object , class 对应 objc_class , meta class 对应的还是 objc_class 。
![](
)
至于 NSObject 所对应的 meta class 就是上图右上角的 root class ( meta )。
卒.