Objetive-C內存佈局

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

相關文章
相關標籤/搜索