alloc
OC创建一个对象p1, LGPerson *p1 = [LGPerson alloc];
alloc开辟内存空间,初始化isa,返回实例对象。
alloc底层到底做了什么? ==》alloc流程分析图
1:OC代码底层探索方法
* //三种方法会在汇编层次找到需要探索的C层面源码(像 alloc, _objc_rootAlloc)
* // 1: 下断点 : 单步调试时,汇编代码中的 某个指令函数,control + in - objc_alloc
* // 2: 下符号断点(symbol breakpoint) : libobjc.A.dylib`+[NSObject alloc]: 添加想要断住的函数
* // 3: 汇编(Debug->Debug Worflow->always show Disassembly:打开汇编) libobjc.A.dylib`objc_alloc:
Debug 和 release 版本的汇编代码不一样,release进行了优化,真机和模拟器同样不同,一个arm64 一个 32(是这样吗??)
2:指针地址 & 内存空间
分析:p1,p2,p3所指内存空间一样,为三个不同的指针
3:objc4-752源码下载编译
源码地址:opensource
选择对应的版本下载,最新为objc756.2,可在开源文件中找到对应的objc4等文件。objc4编译成功需要相应的系统文件支持。
如果你想自己配置可编译objc-756.2的源码,可以看看Cooci帅哥的这篇文章
ps:方法函数的查找 全局搜索 alloc{
4: 内存对齐,给LGperson开辟多少内存空间
对象需要的内存空间 ,以空间换取时间 为8的倍数,8字节对齐,但 最少为16字节 。
//objc_runtime.mm 开辟内存空间给cls
size_t size = cls->instanceSize(extraBytes);=> if (size < 16) size = 16;(给实例对象的size)//小于16 置为16
//内存对齐的算法 &运算 (此处结果为8的倍数,或者16的倍数,或...)
static inline uint32_t word_align(uint32_t x) {
return (x + WORD_MASK) & ~WORD_MASK;
}
5:小端模式 & 大端模式
iOS 是小端模式—— 大小端模式
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
6 :lldb 指令查看对象地址
lldb指令集查看相关对象地址,内存分布。
通过x/4xg 打印对象p 地址,po,p 打印对象属性的值
查看全部的内存地址:Xcode-》Debug -》 Debug workflow-》View memory
7:init做了什么,new 做了什么
源码中,没做什么重要的事,只是返回了 (id)self , 目的类似工厂模式提供给别人来重写init,做些初始化工作。
new,底层调用了 [callAlloc(self, false/*checkNil*/) init];做了【alloc init】的工作。
8:对象p的内存分布,以及包含2个char类型的属性值,如何分布(经过内存对齐, 二进制重排后)
9:对象申请的内存 VS 系统分配的内存
一般对象的属性间,以8字节对齐,对象与对象之间以16字节对齐,之所以8,16 字节对齐,是因为,对象存储时可能会发生溢出,所以多给一点空间。
ps:calloc源码 malloc文件,编译排错处理,酌情删掉不必要的报错。
Ps:打印函数地址,可获得下一步调用的函数
10: 编译器优化
Build Setting 里 release 优化 Fastest,Smallest[0s] 编译优化 and 链接优化 load 方法 耗时。
11:ISA 结构是一个联合体(union)isa结构
union采用了位域技术,优化内存存储,一个ISA 8个字节,64位。isa结构
12:对象的本质
OC对象经过编译后在底层是一个结构体 struct,其父类的属性都继承过来。
13:方法签名
{(struct objc_selector *)"name", "@16@0:8", (void *)_I_LGPerson_name},
{(struct objc_selector *)"setName:", "v24@0:8@16", (void *)_I_LGPerson_setName_}}
"@16@0:8" and v24@0:8@16 type encoding表