阅读 23

iOS - alloc探索发现

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表

关注下面的标签,发现更多相似文章
评论