OC反汇编
创建一个 person 类并且初始化 person 对象。
- (void)viewDidLoad {
[super viewDidLoad];
Person * p = [[Person alloc] init];
}
汇编代码如下:
iOS11 以后编译器做了优化,
alloc不会直接调用objc_msgSend,而是调用objc_alloc。
通过 LLDB 调试发现 x0、x1 就是 objc_msgSend 的隐藏参数(id self,SEL _cmd)
分析一下 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 进行 retain、release 操作。
void
objc_storeStrong(id *location, id obj)
{
id prev = *location;
if (obj == prev) {
return;
}
objc_retain(obj); //retain新值
*location = obj;
objc_release(prev); //release旧值
}