在 /usr/include/objc/objc.h 有定义 指针
struct objc_class { struct objc_class* isa; struct objc_class* super_class; const char* name; long version; long info; long instance_size; struct objc_ivar_list* ivars; struct objc_method_list** methodLists; struct objc_cache* cache; struct objc_protocol_list* protocols; }; typedef struct objc_class *Class;
Class是一个objc_class结构体的指针 code
typedef struct objc_object { Class isa; } *id;
很明显, 一个对象的第1个元素, 是类指针isa 对象
以Programing in Objective-C的 Fraction来分析 io
@interface Fraction: NSObject { int numerator; int denominator; }
很明显能够看到 frac 对象(0x6C6C890) 的第1个元素是 isa, 代表 0x361c 处存着 这个对象的 类对象(class object) class
第2个元素, 就是 numberator, 值为1 object
第3个元素, 就是 deminator, 值为3 List
能够看到 meta
0x361C 就是 类对象(class object), 而且是Fraction 的类对象 im
0x361C 的父类 是 0x1558F4C (它就是 NSObject) img
0x1558F4C(NSObject)就是root class, 它父类是nil(0×0)
它的meta class 就是 root meta class, 也就是NSObject meta class, 位于0x1558F60
而0×3608 就是 Fraction meta class
任何meta class的isa都指向 root meta class, 显然, 3608的isa指向 0x1558f60, 正是 NSObject meta class
NSObject是Fraction的父类, 相应的NSObject meta class是 Fraction meta class的父类, 因此看到3608的superclass指向0x1558f60, 正是NSObject meta class
最让我不能理解的是 root meta class的父类, 竟然是 root class