引言
- 通过上文OC类的加载上知道在
realizeClassWithoutSwift
方法里面是类的实现,这篇文章我们主要研究类的bits的赋值 - 查看加载完成的Person类的bits数据
Person *p = [Person alloc]; //打下断点
[p run];
// 打印的数据
(lldb) x/4gx Person.class
0x100002520: 0x00000001000024f8 0x00000001003f0140
0x100002530: 0x00000001003ea460 0x0000802400000000
- 在
realizeClassWithoutSwift
里面打下断点,打印cls的内存情况
static Class realizeClassWithoutSwift(Class cls, Class previously)
{
......
auto ro = (const class_ro_t *)cls->data();
......
// 打印的数据
x/4gx cls
0x100002540: 0x0000000100002518 0x00000001003f0140
0x100002550: 0x00000001003ea460 0x0000000000000000
- 往下走到
cls->setInstanceSize(ro->instanceSize);
会发现内存数据有所改变
......
// Set fastInstanceSize if it wasn't set already.
cls->setInstanceSize(ro->instanceSize);
......
// 打印数据
(lldb) x/4gx 0x100002540
0x100002540: 0x0000000100002518 0x00000001003f0140
0x100002550: 0x00000001003ea460 0x0000002000000000
-
cls->setHasCxxDtor();
执行完这个方法之后
......
// Copy some flags from ro to rw
if (ro->flags & RO_HAS_CXX_STRUCTORS) {
cls->setHasCxxDtor();
if (! (ro->flags & RO_HAS_CXX_DTOR_ONLY)) {
cls->setHasCxxCtor();
}
}
......
// 打印数据
(lldb) x/4gx 0x100002540
0x100002540: 0x0000000100002518 0x00000001003f0140
0x100002550: 0x00000001003ea460 0x0000002400000000
-
一直走完
realizeClassWithoutSwift
方法,发现最后的数据都没有变化,我没来研究下这个0x000080
究竟是什么时候赋值进去。 -
通过一顿操作,最后发现是在
setDefault
之后赋值进去的 -
完整的流程如下
未命名文件.png -
在执行
setDefault
之后得到数据就和我们最开始打印的一样了
网友评论