5.类的原理分析(下)

323 阅读1分钟

一、类的内存的ro数据

LGPerson类的定义 image.png 打印ro的过程(.ro()函数如果不知道的话,可以去底层源码看下,在class_rw_t结构体中) image.png 可以看到ivars中存储所有的成员变量,在底层中属性和成员变量都是一样的,只不过属性被编译成_name和setter getter方法,也可以这么说 property = ivar + setter + getter

二、成员变量和属性以及编码

定义LGPerson image.png 编译成c++源码 终端命令 xcrun -sdk iphonesimulator clang -arch arm64 -rewrite-objc LGPerson.m -o LGPerson.cpp

image.png 1.property被注释了,被编译成_name+setter+getter

2.为什么getter方法有2种获取方式objc_setProperty和地址偏移?

3.编码 image.png 这些都是什么意思?

例子: @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的时候有复制内存的操作,别的没有

推荐一篇介绍文章,我就不写了哈

juejin.cn/post/697614…

四、类方法的存储

image.png 通过打印可以看到:实例方法saySomething在类中,而类方法不在类中

image.png 通过打印元类的方法列表可以看到,类方法say666就在其中。。。