美文网首页
oc-class的bits的赋值时机

oc-class的bits的赋值时机

作者: 浪的出名 | 来源:发表于2020-10-22 17:44 被阅读0次

引言

  • 通过上文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之后得到数据就和我们最开始打印的一样了

相关文章

网友评论

      本文标题:oc-class的bits的赋值时机

      本文链接:https://www.haomeiwen.com/subject/lilpmktx.html