返回

底层探索:揭开对象的奥秘(上)

IOS

踏入底层探索的旅程,让我们开启一场揭开对象奥秘的探险。在现代编程世界中,对象扮演着至关重要的角色,掌控它们的行为和机制对于释放我们代码的全部潜力至关重要。在本文中,我们将深入对象的底层,揭示它们的核心功能和结构,为理解高级概念和调试技术奠定坚实的基础。

在开始我们的探索之前,让我们建立一个牢固的基础。汇编语言是了解底层机制的关键,它允许我们直接与计算机的指令交互。对于本系列文章,我们将主要使用 ARM64 架构,它广泛用于移动设备和服务器中。

ARM64 汇编简介

ARM64 汇编使用一系列助记符来表示机器指令,每个助记符对应一个特定操作。下面列出了一些最常见的 ARM64 汇编指令:

  • bl:跳转指令,用于调用方法
  • ret:函数的返回
  • ; : 注释

为了方便参考,我还列出了三种探索源码的思路:

探索源码的思路

  1. 断点 :在代码执行期间暂停程序,并检查寄存器和内存中的值。
  2. 符号断点 :在特定函数或方法被调用时暂停程序。
  3. 通过汇编探索 :反汇编可执行文件,以查看底层指令。

探索 alloc 方法

作为我们的第一个探索案例,让我们看看 Objective-C 中的 alloc 方法是如何实现的。alloc 方法负责分配一个新对象的内存空间。

通过汇编探索

使用 objdump 工具,我们可以反汇编 objc 框架中的 alloc 方法。以下是反汇编后的代码片段:

alloc:
    stp x0, x1, [sp, -16]!
    mov x0, x2
    bl x19
    ldp x0, x1, [sp], 16
    ret

从这段代码中,我们可以看到以下步骤:

  1. 保存寄存器 x0x1 到堆栈中。
  2. x2 寄存器的值移动到 x0 寄存器中。
  3. 调用 x19 寄存器中存储的函数。
  4. 从堆栈中加载寄存器 x0x1
  5. 返回到调用函数。

通过分析汇编代码,我们了解到 alloc 方法调用了一个函数,该函数负责分配新对象的内存。

通过查询 objc

我们还可以使用 objc 查询函数来获取 alloc 方法的实现。以下是查询的示例:

[objc class] alloc

这将输出以下信息:

IMP: 0x183838

该 IMP(实现指针)指向实际的 alloc 实现。我们可以使用 nm 工具查看函数的地址:

nm /usr/lib/libobjc.A.dylib | grep alloc

这将输出以下信息:

0000000000023b70 T objc_msgSend
0000000000023ba0 T objc_msgSend_stret
0000000000023bc0 T objc_msgSendSuper
0000000000023be0 T objc_msgSendSuper_stret

从这些信息中,我们可以看到 alloc 方法的实际实现位于地址 0x23b70

在本文中,我们介绍了底层探索的基本概念,并通过探索 alloc 方法,展示了如何使用汇编和 objc 查询来深入了解底层实现。在后续的文章中,我们将继续深入探讨对象、内存管理和高级技术,以帮助您掌握 Objective-C 编程的精髓。

继续关注,让我们一起踏上底层探索的迷人旅程。