其他文章请点击下方:
alloc 底层原理
首先,我们通过一个自定义XLPerson类,实例化两个对象,并打印他们的指针地址,是否一致?
XLPerson *p = [XLPerson alloc]; 通过类创建的实例对象
XLPerson *p1 = [p init];
XLPerson *p2 = [p init];
NSLog(@"p=%@\np1=%@\np2=%@",p,p1,p2);
结果是一致的,我们接下来分析一下alloc&init内部的实现过程。
汇编分析过程
- 打开Xode - Debug - Debug Workflow - Always Show Disassembly
- 运行设置断点
- 查看 All Variables
- 编译器调试命令register read
- 添加符号断点 Symbolic BreakPoint (alloc)
- LibOjbc.A.dylib 下载源码
alloc源码流程
- _objc_rootAlloc
- callAlloc
- class_createInstance
- _class_createInstanceFromZone
- cls->instanceSize
- calloc
- initInstanceIsa
init 源码
- _objc_rootInit(id obj)
- return obj 工厂设计模式,交由子类自定义重写
编译器优化
设置-build setting - optimization - fast smallest
作用:
- 编译时间
- 链接时间
- 运行时间
- 空闲时间
字节对齐
# define WORD_MASK 7UL
static inline size_t word_align(size_t x) {
return (x + WORD_MASK) & ~WORD_MASK; //按8的倍数增长
}
对象占用大小是按照8字节对齐
系统分配对象内存算法
size_t instanceSize(size_t extraBytes) {
size_t size = alignedInstanceSize() + extraBytes;
// CF requires all objects be at least 16 bytes.
if (size < 16) size = 16;
return size;
}
//系统开辟内存大小以16倍数
#define SHIFT_NANO_QUANTUM 4
#define NANO_REGIME_QUANTA_SIZE (1 << SHIFT_NANO_QUANTUM) // 16
#define NANO_QUANTA_MASK (NANO_REGIME_QUANTA_SIZE - 1)
k = (size + NANO_REGIME_QUANTA_SIZE - 1) >> SHIFT_NANO_QUANTUM; // round up and shift for number of quanta
slot_bytes = k << SHIFT_NANO_QUANTUM;
系统分配内存大小是按照16字节对齐