一、类的内存的ro数据
LGPerson类的定义
打印ro的过程(.ro()函数如果不知道的话,可以去底层源码看下,在class_rw_t结构体中)
可以看到ivars中存储所有的成员变量,在底层中属性和成员变量都是一样的,只不过属性被编译成_name和setter getter方法,也可以这么说
property = ivar + setter + getter
二、成员变量和属性以及编码
定义LGPerson
编译成c++源码 终端命令 xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc LGPerson.m -o LGPerson.cpp
1.property被注释了,被编译成_name+setter+getter
2.为什么getter方法有2种获取方式objc_setProperty和地址偏移?
3.编码
这些都是什么意思?
例子: @16@0:8
@ id类型
16 占用的内存
@ id类型(函数的隐士参数self)
0 从0号位置开始
: SEL
8 从8号位置开始
对应的这些编码苹果都有,地址是 developer.apple.com/library/arc…
三、setter方法的底层原理
什么时候会调用这个objc_setProperty?先说结论用copy的时候
在llvm中可以看到,根据这个方法objc_setProperty可以找到条件判断语句,当使用copy的时候会调用objc_setProperty函数。copy的时候有复制内存的操作,别的没有
推荐一篇介绍文章,我就不写了哈
四、类方法的存储
通过打印可以看到:实例方法saySomething在类中,而类方法不在类中
通过打印元类的方法列表可以看到,类方法say666就在其中。。。