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结构体的指针

typedef struct objc_object {
    Class isa;
} *id;

很明显, 一个对象的第1个元素, 是类指针isa

以Programing in Objective-C的 Fraction来分析

@interface Fraction: NSObject {
    int numerator;
    int denominator;
}

 

Objetive-C内存布局_第1张图片

很明显可以看到 frac  对象(0x6C6C890) 的第1个元素是  isa, 表明 0x361c 处存着  这个对象的 类对象(class object)

第2个元素, 就是  numberator, 值为1

第3个元素, 就是  deminator, 值为3

 

Objetive-C内存布局_第2张图片

Objetive-C内存布局_第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

你可能感兴趣的:(Objective-C,内存,oc)