关于 alloc 底层探索

2019-02-19  本文已影响0人  LoZR

最近学习了一下关于底层汇编的知识点,这次先拿 alloc的方法进行一下底层分析。
我们可以使用 汇编断点的操作 或直接下载 objc4-750 来搜索对应方法的具体实现来进行分析。

首先,我们先勾选一个东东(图上是没有勾上的),便于我们可以看到详细的汇编流程,如下图:


image.png

然后我们开始运行代码了,代码如下:


image.png

注意:记得打断点

image.png

上图,当断点到第18行时,采用第3步操作Step into instruction(hold Control) 即: 按住“control”键 + 点击下箭头,后述简称“下箭头”

点击后跳转到下图:

image.png

此处已经进入到 objc_msgSend 这个函数内,在打印台输入 register read ,我们可以看到里面有很多个寄存器;
然后使用Symbol 设置alloc断点:

设置完之后继续往下走一个断点,跳入:


image.png

我们可以看到实际是调用了libobjc.A.dylib+[NSObject alloc],然而 alloc 内部是一个 _objc_rootAlloc的函数;
点击下箭头再往下走:

image.png

上图可以看到 _objc_rootAlloc 内部又调用了一个 class_createInstance,再次把断点打在第14行,在点击下箭头往里面看看class_createInstance 是隐藏了些什么?
如下图:

image.png image.png

按照上图的的命令行, register read把全部寄存器打印出来,然后po + “第一个地址”,就可以输出我们所需的实例对象,所以调用alloc 就已经把实例对象创建出来了

具体libobjc.A.dylib 里面各种函数是怎么实现的? 我们可以下载一个objc4-750的工程,libobjc.A.dylib里面的开源代码就是在objc4-750里面;
下载地址: https://opensource.apple.com/release/macos-1014.html

8077488E66EA85166F04E2D534A84567.jpg

下载后打开并搜索allco就可以看到此方法的具体实现了,至于里面的更深一步的封装这里就不一一描述了,请自行点进去慢慢摸索吧,如下图:

image.png

关于objc4-750工程配置问题,请参考: https://www.jianshu.com/p/bbafd02ad0bb
以上内容纯粹个人见解,仅用于分享交流;如有描述不当之处,欢迎指出。

上一篇 下一篇

猜你喜欢

热点阅读