1、代码的编译过程

1.1、编译

image.png
OC语言通过编译得到汇编语言,汇编语言编译后得到机器语言。

1.2、反编译

image.png
机器语言可以反编译成汇编语言,因为在同一种架构平台下,每一条汇编指令都有与之对应的唯一的机器指令。但是汇编无法反编译成OC语言,因为不同的OC代码编译出来的汇编代码可能是一致的,比如下面两段OC代码,编译后的汇编代码一致:

  1. unsigned int x = 10;
  2. unsigned int y = 10;
  3. unsigned int z = x + y;
  4. NSLog(@"z = %d", z);
  1. int a = 10;
  2. int b = 10;
  3. int c = a + b;
  4. NSLog(@"c = %d", c);
  1. 0x100003f2b <+27>: movq %rax, -0x28(%rbp)
  2. 0x100003f2f <+31>: movl $0xa, -0x14(%rbp)
  3. 0x100003f36 <+38>: movl $0xa, -0x18(%rbp)
  4. 0x100003f3d <+45>: movl -0x14(%rbp), %eax
  5. 0x100003f40 <+48>: addl -0x18(%rbp), %eax
  6. 0x100003f43 <+51>: movl %eax, -0x1c(%rbp)
  7. 0x100003f46 <+54>: movl -0x1c(%rbp), %esi
  8. 0x100003f49 <+57>: leaq 0xb8(%rip), %rdi
  9. 0x100003f50 <+64>: movb $0x0, %al
  10. 0x100003f52 <+66>: callq 0x100003f68

2、Hopper Disassembler

Hopper Disassembler 能够将Mach-O文件的机器语言代码发编译成汇编代码,OC伪代码或者Swift伪代码。比如查看可执行文件iOSDemo:
image.png
image.png
在汇编代码处右键选择 References to selector XXX 可以查看有哪些地方引用了此方法:
image.png

快捷键:Shift + Option + X

除了可执行文件外,Hopper还可以查看其它类型的Mach-O文件,例如系统的动态库UIKitCore:
image.png
image.png