看看 Objective-C 里面 Class 和实例的数据结构

链接:https://juejin.cn/post/6912359669704949767

objc 源码下载地址

首先到苹果objc源码官网下载一个最新的包,这里下载的是 objc4-781.tar

Class 和实例的数据结构

看一个例子

// ---------------- Animal ---------------- 

@interface Animal : NSObject {
@public
    int _age;
}

- (void)run; // 实例方法
+ (void)animalClassRun; // 类方法

@end

@implementation Animal

- (void)run {
    // ...
}

+ (void)animalClassRun {
    // ...
}

@end

// ---------------- Cat ---------------- 

@interface Cat : Animal {
@public
    int _legs;
}
- (void)jump; // 实例方法

@end

@implementation Cat

- (void)jump {
    // ...
}

@end

继承关系是: Cat: Animal: NSObject

测试一下:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Cat *cat = [[Cat alloc] init];
        cat->_age = 6;
        cat->_legs = 4;
        [cat run];
        NSLog(@"cat %p", cat);
    }
}

根据输出地址查看cat对象里面的内存数据(x/2xg 指令是查看前面16个字节的内存数据):

(lldb) x/2xg 0x1004aff60
0x1004aff60: 0x001d800100008299 0x0000000400000006

可以看到对象里面有具体的实例变量的值 0x0000000400000006 。0x00000004 和 0x00000006。那么0x001d800100008299是什么呢?它其实是经过一些运算得到的 isa 指针地址

查看objc源码里面的实例对象的结构体 objc_object 。它是个这样的东西:

顺便找到 Class 的内部代码, 是个这样的东西:

好吧,它们内部其实都是结构体指针(可以看到 struct objc_class : objc_object,所以类其实也是对象)。

存储的数据

实例,类,元类的关系:

实例 (通过isa指针 --->) 类 (通过isa指针 --->) 元类

对象的存储
这里有一个iOS交流圈:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值