汇编(五)OC反汇编

415 阅读1分钟

OC反汇编

创建一个 person 类并且初始化 person 对象。

- (void)viewDidLoad {
    [super viewDidLoad];
    Person * p = [[Person alloc] init];
}

汇编代码如下: image.png

iOS11 以后编译器做了优化,alloc 不会直接调用 objc_msgSend,而是调用objc_alloc

通过 LLDB 调试发现 x0、x1 就是 objc_msgSend 的隐藏参数(id self,SEL _cmd) image.png

分析一下 objc_storeString

// x8存储栈的内存地址
 0x1002fe48c <+84>:  add    x8, sp, #0x8              ; =0x8 
 // x0是p(实例化完成的person对象的地址),把它写入到 sp偏移#0x8 这个地址。即 x8 = &p
 0x1002fe490 <+88>:  str    x0, [sp, #0x8]
 0x1002fe494 <+92>:  mov    x0, x8
 // x8 = 0
 0x1002fe498 <+96>:  mov    x8, #0x0
 0x1002fe49c <+100>: mov    x1, x8
 // objc_storeString(&p,0)
 0x1002fe4a0 <+104>: bl     0x1002fe9a0 

此时,跳转 runtime 进行 retainrelease 操作。

void
objc_storeStrong(id *location, id obj)
{
    id prev = *location;
    if (obj == prev) {
        return;
    }
    objc_retain(obj); //retain新值
    *location = obj;
    objc_release(prev); //release旧值
}