类的结构
struct objc_class : objc_object{
// Class ISA 8bytes
Class superclass 8bytes
cache_t cache 16bytes
class_data_bits_t bits
````
}
但仅仅源码层面还不足以知道类的结构。那么通过在类里添加属性以及clang 编译出源c代码
clang -x objective-c -rewrite-objc -issysroot /Application````/iPhoneSimulator.sdk
得到main.cpp
static struct { //method_list_t 这是类结构之一
method_count
entsize
struct _objc_method method_list[8] //8取决于有多少个成员变量以及属性
}_OBJC_$_INSTANCE_METHODS_CLASS __attribute__ ((used,section("__DATA,__objc_const")))={
sizeof(_objc_methond),
8,
{{(struct objc_selector *"class_method such as name age date nickName","@16@0:8",(void *)_I_Person_nickName},
{{(struct objc_selector *" date","v16@0:8",(void *)_I_Person_date},
}
不难发现类的成员变量以及属性,会通过一个构造函数 struct objc_selector传入三个参数1.sel名字 2.大小 3._I_所在类的名字_变量名字 _I_CLASS_age/name/nickName/setName
@16@0:8
第一个@:返回值 id,
16代表公共字节,
第二个@代表第一个参数8大小,
0: 从零开始
那么我们通过Xcode的LLDB窗口得到Class的地址
p/x Study.class = $0
强转
p (class_data_bits_t *) $0
p $1->data() 这里开了上帝视角
(class_rw_t *)$2
p $2->methods
(const method_array_t)$3
p $3.list
p *$4
p $5.get(0)
探索止步
注释:OC里成员变量和属性的区别在于 属性底层声明时变量会增加“_”符号,以及set get方法,而成员变量没有。(我也不记得这个注释是哪里来的,莫名出现在笔记本上)