美文网首页
01--方法本质01--方法初探

01--方法本质01--方法初探

作者: 修_远 | 来源:发表于2020-06-15 16:49 被阅读0次

    [TOC]

    alloc 流程

    alloc 流程

    1. alloc 流程1

    这个流程是按照源码进行绘制,包含了源码中的各种分支判断

    alloc流程1

    2. alloc 流程2

    这个流程省略的一些流程,源码注释中说 zone 参数已被忽略,所以省略了部分与 zone 有关的判断

    _objc_rootAllocWithZone(Class cls, malloc_zone_t *zone __unused)
    {
        // allocWithZone under __OBJC2__ ignores the zone parameter
        return _class_createInstanceFromZone(cls, 0, nil,
                                             OBJECT_CONSTRUCT_CALL_BADALLOC);
    }
    
    alloc流程2

    alloc一个对象分配多大内存?

    • 对齐方式的说明
    • 对象最小是16字节的说明
    size_t instanceSize(size_t extraBytes) const {
        if (fastpath(cache.hasFastInstanceSize(extraBytes))) {
            return cache.fastInstanceSize(extraBytes);
        }
    
        size_t size = alignedInstanceSize() + extraBytes;
        // CF requires all objects be at least 16 bytes.
        if (size < 16) size = 16;
        return size;
    }
    
    计算对象大小
    • 第一行调用了一个方法alignedInstanceSize(), 下面的代码中就是这个方法的实现
    • 第二个方法中返回的是data()->ro->instanceSize, 这个data表示的是类在加载时的数据, 包括属性列表, 方法列表等.
    • 重点来看第三个方法 word_align, 看到方法名, 首先肯定是根据名字猜测下方法含义, word-字节, align-对齐, 难道是字节对齐. 找到WORD_MASK的值为7. 对x先加7, 然后再和非7相与.看下二进制计算:

    7 的二进制数 0000 0111 (省略前面7个字节的0)
    !7 的二进制数 1111 1000 (省略前面7个字节的1)
    (x+7)>=8 : 表示将x的值提一阶, 只要x有值, 那么我就给他8个字节
    (x+7) & (~7) : 表示第四位后面的数我都不要了, 那么这个数就肯定是8的整数倍
    所以这个方法的作用就是提阶对齐

    • 第一行代码获取到了这个实例的大小, 第二行if (size < 16) size = 16;, 这里可以看出, 苹果返回的对象最小大小为16字节.

    对象

    ARM芯片(iphone)默认采用小端模式

    小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

    • 内存地址
    • 数据高/低字节

    lldb中 x 表示输出内存段地址
    由于是小端序, 地址要倒着读

    image

    5xg

    10xw


    image

    g-每一段8字节 64位
    w-每一段4字节 32位

    image

    int 会转成 NSNumber对象存储
    long 还是 long类型, 不会被转成对象存储

    查看所有的内存段地址
    Debug->Debug Workflow->View Memory

    相关文章

      网友评论

          本文标题:01--方法本质01--方法初探

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