前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ARM64下OC的汇编

ARM64下OC的汇编

原创
作者头像
Wilbur-L
修改2021-02-05 17:58:00
1.7K0
修改2021-02-05 17:58:00
举报
文章被收录于专栏:iOS底层原理

一·动态调试

oc-汇编
oc-汇编

断点处可以看见,x0 objc_alloc_init调用方法,从x8取出,既看x8和x0寄存器。

使用LLDB regist read x8 可以得到x8保存的是类对象Person

add x8 ,x8 ,#0x538

ldr x0, [x8]

这句汇编代码说明了:Person对象调用alloc方法

0x1049d5d88 adrp x8 ,8

忽略后三位0x1049d5 5+8=13

得到0x1049dd 补上0x538=0x1049dd538

p (SEL)0x1049dd538 得到方法

此时内存中还没有初始化对象

直到这句汇编

str x0,[sp,#0x8]

然后LLDB调试得到 po p 就可以得到对象

二·objc_storeStrong

疑问谁调用了objc_storeStrong

依旧使用动态调试查看x0 的值

str
str

代码解读:

add x8 ,sp,#0x8

反映到代码上就是 x8 = &p

寄存器x8 保存sp偏移8个字节的栈内存地址

str x0,[sp,#0x8]

把[[Person alloc] init]的返回值给到sp在栈空间偏移8个字节,然后返回该对象的地址给x0

反映到代码上就是 Person *p =[[Person alloc] init]

所以po p可以得到对象.

mov x0, x8

mov x8,#0x0

此时调用的参数有结果了

objc_storeStrong(x0,x8) ->objc_storeStrong(&p,nil)

然后栈平衡汇编结束

三·Runtime

objc_storeStrong函数在objc4-750苹果官网处开源

objc_storeStrong(id *location,id obj){

id prev = *location; // p = *&p

id (obj==prev){ //如果对象是空返回

return;

}

objc_retain(obj); //retain nil

*location = obj; //p = nil 非ARC下需要手动管理内存

objc_release(prev); //objc_release(p)

}

id本身就是OC对象,是一个指针类型,泛型,any类。id * 指向oc对象的一个指针

这句ARC函数做了这几件事:

1.把p=nil 指向nil

2.release 原来p指向的堆空间

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一·动态调试
  • 二·objc_storeStrong
  • 三·Runtime
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档