美文网首页
02--对象本质01--alloc本质

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

作者: 修_远 | 来源:发表于2020-07-10 15:07 被阅读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

相关文章

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

    [TOC] alloc 流程 alloc 流程 1. alloc 流程1 这个流程是按照源码进行绘制,包含了源码中...

  • 02--对象本质02--isa本质

    [TOC] 一、联合体 Union 1.1 联合体的特性 联合体 union 也成共用体,有以下特性: union...

  • 02--对象本质04--类的结构

    [TOC] 怎么读到cache_t属性image 四个属性 在源码中关于类objc_class的结构体代码, 总共...

  • OC 与 Swift

    OC对象的本质(上):OC对象的底层实现原理OC对象的本质(中):OC对象的种类OC对象的本质(下):详解isa&...

  • OC对象的本质(中)—— OC对象的种类

    OC对象的本质(上):OC对象的底层实现原理OC对象的本质(中):OC对象的种类OC对象的本质(下):详解isa&...

  • OC对象的本质(下)—— 详解isa&supercl

    OC对象的本质(上):OC对象的底层实现原理OC对象的本质(中):OC对象的种类OC对象的本质(下):详解isa&...

  • OC对象原理探究(下)

    介绍正文前,我们思考一个问题,什么是对象?或者说OC对象的本质是什么? 对象本质以及拓展 在探索oc对象本质前,先...

  • iOS底层 - 对象的本质,方法的本质

    对象的本质是结构体 方法的本质是消息发送 对象的本质 首先有一个SPPerson对象 我们知道OC底层是C和C++...

  • block 笔记

    block本质是OC对象(封装了函数调用以及调用环境的OC对象) 本质

  • OC 对象本质

    一个 NSObject 对象占用多少内存? 对象的 isa 指针指向哪里? OC的类信息存放在哪里? 第一个问题就...

网友评论

      本文标题:02--对象本质01--alloc本质

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