[TOC]
alloc 流程
alloc 流程
1. alloc 流程1
这个流程是按照源码进行绘制,包含了源码中的各种分支判断
alloc流程12. 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
表示输出内存段地址
由于是小端序, 地址要倒着读
5xg
10xw
image
g-每一段8字节 64位
w-每一段4字节 32位
int 会转成 NSNumber对象存储
long 还是 long类型, 不会被转成对象存储
查看所有的内存段地址
Debug
->Debug Workflow
->View Memory
网友评论