转自:http://zhiwei.li/text/2012/03/objetive-c%E5%86%85%E5%AD%98%E5%B8%83%E5%B1%80/
在 /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结构体的指针
typedef struct objc_object { Class isa; } *id;
很明显, 一个对象的第1个元素, 是类指针isa
以Programing in Objective-C的 Fraction来分析
@interface Fraction: NSObject { int numerator; int denominator; }
很明显可以看到 frac 对象(0x6C6C890) 的第1个元素是 isa, 表明 0x361c 处存着 这个对象的 类对象(class object)
第2个元素, 就是 numberator, 值为1
第3个元素, 就是 deminator, 值为3
可以看到
0x361C 就是 类对象(class object), 并且是Fraction 的类对象
0x361C 的父类 是 0x1558F4C (它就是 NSObject)
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