isa详解

作者: 海浪萌物 | 来源:发表于2019-12-20 14:28 被阅读0次

    接上一篇文章

    一、isa初始化流程

    image.png

    我们可以看大在alloc时候会将类右移三位后保存在isa.shiftcls里面

    首先我们发现object_getClass函数其实就是去除对象的isa功能 image.png
    进到getIsa函数 image.png
    因为主要都是走第一行 if (!isTaggedPointer()) return ISA()
    我们进到ISA()函数中看看
    image.png
    我们看到 image.png
    SUPPORT_INDEXED_ISA一般都是0,所以返回的是 image.png

    我们在看下isa的结构


    image.png

    其中ISA_MASK的值是


    image.png
    这是从isa指针中取出类对象

    验证流程:

    1576770136344.jpg
    我们先通过x/4gx object 命令拿到object对象的前4个属性的内存地址,首先我们确定的是对象的第一个属性必然是isa,因为所以对象都是继承NSObject,NSObject里面第一个就是isa成员变量 image.png

    在上面我们发现取isa时候是isa.bits & ISA_MASK

    我们拿取到的isa地址和ISA_MASK与一下得到结果:

    (lldb) p/x 0x001d800100001131 & 0x00007ffffffffff8ULL
    (unsigned long long) $1 = 0x0000000100001130
    

    然后再拿到object类的地址

    (lldb) p/x LGPerson.class
    (Class) $2 = 0x0000000100001130 LGPerson
    

    我们会发现得到的两个值是一样的

    相关文章

      网友评论

          本文标题:isa详解

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