美文网首页
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