美文网首页
关于 alloc 底层探索

关于 alloc 底层探索

作者: LoZR | 来源:发表于2019-02-19 11:44 被阅读0次

    最近学习了一下关于底层汇编的知识点,这次先拿 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
    以上内容纯粹个人见解,仅用于分享交流;如有描述不当之处,欢迎指出。

    相关文章

      网友评论

          本文标题:关于 alloc 底层探索

          本文链接:https://www.haomeiwen.com/subject/stxzeqtx.html