链接:https://juejin.cn/post/6912359669704949767
首先到苹果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交流圈: