OC的类信息存放在哪里?

instance对象
isa、成员变量的具体值
class对象
isa、superclass、对象方法、属性、成员变量(名字、类型等信息)、协议信息
meta-class对象
isa、superclass、类方法
struct objc_class : objc_object {
Class superclass;
cache_t cache;
class_data_bits_t bits;
class_rw_t *data() {
return bits.data();
}
}
struct objc_object {
isa_t isa;
}
class_rw_t* data() {
return (class_rw_t *)(bits & FAST_DATA_MASK);
}
struct class_rw_t {
uint32_t flags;
uint32_t version;
uint16_t witness;
const class_ro_t *ro;
method_array_t methods;
property_array_t properties;
protocol_array_t protocols;
Class firstSubclass;
Class nextSiblingClass;
char *demangledName;
}
struct class_ro_t {
uint32_t flags;
uint32_t instanceStart;
uint32_t instanceSize;
#ifdef __LP64__
uint32_t reserved;
#endif
const uint8_t * ivarLayout;
const char * name;
method_list_t * baseMethodList;
protocol_list_t * baseProtocols;
const ivar_list_t * ivars;
const uint8_t * weakIvarLayout;
property_list_t *baseProperties;
}
对象的isa指针指向哪里?

指针指向:
一、isa
1、instance的isa指向class
2、class的isa指向meta-class
3、meta-class的isa指向基类的meta-class
二、superclass
1、class的superclass指向父类的class(如果没有父类,superclass指向nil)
2、meta-class的superclass指向父类的meta-class(基类的meta-class的superclass指向基类的class)
方法调用轨迹:
一、instance调用对象方法的轨迹
isa找到class,如方法不存在,就通过superclass找父类
二、class调用类方法的轨迹
isa找到meta-class,如方法不存在,就通过superclass找父类
@interface TBPerson : NSObject
@end
@implementation TBPerson
@end
@interface TBStudent : TBPerson
@end
@implementation TBStudent
@end
struct tb_objc_object {
Class isa;
Class superclass;
};
TBPerson *person = [[TBPerson alloc] init];
Class person_class = object_getClass(person);
struct tb_objc_object *person_class1 = (__bridge struct tb_objc_object *)(person_class);
Class meta_class = object_getClass(person_class);
struct tb_objc_object *student_class = (__bridge struct tb_objc_object *)([TBStudent class]);
(lldb) p/x person_class
(Class) $0 = 0x0000000100002110
(lldb) p/x person->isa
(Class) $1 = 0x001d800100002111
(lldb) p/x 0x001d800100002111 & 0x00007ffffffffff8
(long) $2 = 0x0000000100002110
(lldb) p/x person_class1->isa
(Class) $0 = 0x00000001000020e8
(lldb) p/x meta_class
(Class) $1 = 0x00000001000020e8
(lldb) p/x 0x00000001000020e8 & 0x00007ffffffffff8
(long) $2 = 0x00000001000020e8
# if __arm64__
# define ISA_MASK 0x0000000ffffffff8ULL
# elif __x86_64__
# define ISA_MASK 0x00007ffffffffff8ULL
# endif
(lldb) p/x person_class1
(tb_objc_object *) $0 = 0x00000001000021a8
(lldb) p/x student_class->superclass
(Class) $1 = 0x00000001000021a8
PS 此文为学习 李明杰 老师的 iOS底层原理课程所写笔记