OC的内存布局

转自: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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值