1.alloc底层探究

1.alloc底层探究

嘘,别说话,吻我(开搞)

一、起因

从一段代码说起

结果:

3个不同的指针(地址相差8个字节)指向同一块内存区域

注:%@-obj1 打印对象的类型以及内存地址

%p-obj1 打印对象的内存地址

%p-&obj1 打印对象的指针

疑问:

1.alloc做了什么事情?

2.init又做了什么?

3.怎么读取这些函数的源码?

二、三种断点的方式(让源码浮出水面)

1.符号断点

①、先在alloc函数加断点

②、然后按住control 再点击 step into 按钮(可以多次点击)

③、此时断点来到此处(可以看到实现函数objc_alloc)

④、在objc_alloc上加符号断点

⑤、大功告成(可以看到实现是在 libobjc.A.dylib 库中的 _objc_rootAllocWithZone 函数中)

2.汇编

①、先在alloc函数加断点

②、勾选Debug-Debug Workflok-Always Show Disassembly

③、当走到 objc_alloc 时 按住control 点击step into,此时走到 objc_alloc函数,接下来也是符号断点(同方式一种的)

3.已知符号断点

①、直接符号断点 alloc

此时,已经知道源码的位置了,然后去苹果官网下载就好opensource.apple.com

配置好的源码github.com/wangshaofen…

三、编辑源码,可以查看到alloc的流程

1.编译器优化

2.instanceSize(计算内存大小)

然后进入计算方式

eg: (x + WORD_MASK) & ~WORD_MASK(8+7)&(~7)15: 0000 11117 : 0000 0111~7: 1111 100015&(~7): 0000 1000 = 8也就是8字节对齐

通过代码可知,苹果内部是8字节对齐计算内存的,分配内存的时候是以16字节的对齐进行分配的

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部