02--对象本质01--alloc本质

2020-07-10  本文已影响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一个对象分配多大内存?

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;
}
计算对象大小

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

对象

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

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

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

image

5xg

10xw


image

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

image

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

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

上一篇 下一篇

猜你喜欢

热点阅读