关于 alloc 底层探索
最近学习了一下关于底层汇编的知识点,这次先拿 alloc
的方法进行一下底层分析。
我们可以使用 汇编断点的操作
或直接下载 objc4-750
来搜索对应方法的具体实现来进行分析。
首先,我们先勾选一个东东(图上是没有勾上的),便于我们可以看到详细的汇编流程,如下图:
![](https://img.haomeiwen.com/i4735939/3c1c49ab30d8c224.png)
然后我们开始运行代码了,代码如下:
![](https://img.haomeiwen.com/i4735939/96d0c5419358a305.png)
注意:记得打断点
![](https://img.haomeiwen.com/i4735939/d9c17a87b07a4d61.png)
上图,当断点到第18行时,采用第3步操作Step into instruction(hold Control)
即: 按住“control”键 + 点击下箭头,后述简称“下箭头”
点击后跳转到下图:
![](https://img.haomeiwen.com/i4735939/edbea0d4c3de085b.png)
此处已经进入到 objc_msgSend
这个函数内,在打印台输入 register read
,我们可以看到里面有很多个寄存器;
然后使用Symbol
设置alloc
断点:
设置完之后继续往下走一个断点,跳入:
![](https://img.haomeiwen.com/i4735939/3cb3598a1eaf1eb1.png)
我们可以看到实际是调用了libobjc.A.dylib
的+[NSObject alloc]
,然而 alloc
内部是一个 _objc_rootAlloc
的函数;
点击下箭头
再往下走:
![](https://img.haomeiwen.com/i4735939/3aadb189808f4358.png)
上图可以看到 _objc_rootAlloc
内部又调用了一个 class_createInstance
,再次把断点打在第14行,在点击下箭头
往里面看看class_createInstance
是隐藏了些什么?
如下图:
![](https://img.haomeiwen.com/i4735939/9c81cef98d8eb386.png)
![](https://img.haomeiwen.com/i4735939/516b690cee91aa80.png)
按照上图的的命令行, register read
把全部寄存器打印出来,然后po + “第一个地址”
,就可以输出我们所需的实例对象,所以调用alloc
就已经把实例对象创建出来了
具体libobjc.A.dylib
里面各种函数是怎么实现的? 我们可以下载一个objc4-750
的工程,libobjc.A.dylib
里面的开源代码就是在objc4-750
里面;
下载地址: https://opensource.apple.com/release/macos-1014.html
![](https://img.haomeiwen.com/i4735939/8b95616c3122df7a.jpg)
下载后打开并搜索allco
就可以看到此方法的具体实现了,至于里面的更深一步的封装这里就不一一描述了,请自行点进去慢慢摸索吧,如下图:
![](https://img.haomeiwen.com/i4735939/541290f4fdc956bb.png)
关于objc4-750
工程配置问题,请参考: https://www.jianshu.com/p/bbafd02ad0bb
以上内容纯粹个人见解,仅用于分享交流;如有描述不当之处,欢迎指出。