在 /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