最近学习了一下关于底层汇编的知识点,这次先拿 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
的函数;
点击下箭头
再往下走:
上图可以看到 _objc_rootAlloc
内部又调用了一个 class_createInstance
,再次把断点打在第14行,在点击下箭头
往里面看看class_createInstance
是隐藏了些什么?
如下图:
按照上图的的命令行, register read
把全部寄存器打印出来,然后po + “第一个地址”
,就可以输出我们所需的实例对象,所以调用alloc
就已经把实例对象创建出来了
具体libobjc.A.dylib
里面各种函数是怎么实现的? 我们可以下载一个objc4-750
的工程,libobjc.A.dylib
里面的开源代码就是在objc4-750
里面;
下载地址: https://opensource.apple.com/release/macos-1014.html
下载后打开并搜索allco
就可以看到此方法的具体实现了,至于里面的更深一步的封装这里就不一一描述了,请自行点进去慢慢摸索吧,如下图:
关于objc4-750
工程配置问题,请参考: https://www.jianshu.com/p/bbafd02ad0bb
以上内容纯粹个人见解,仅用于分享交流;如有描述不当之处,欢迎指出。
网友评论