欢迎来到底层世界,让我们一起打开通往底层世界的大门。
入门的三种方式:
查找指定函数的底层源码: 本文以
Person
对象的alloc
函数为例
-
符号断点
跟流程 -
control
+step into
- 汇编查找
方法一: 符号断点跟流程
tips: 断点
高亮色
为启动
,鼠标左键再点一下会置灰
,表示取消
断点
- 入口断点
找到Person
调用alloc
的位置,鼠标左键
点击编辑器左侧行数
即可

- 符号断点
step1: Xcode左上角
切换到断点调试面板

step2: Xcode左下角点击+
号,点击Symbolic Breakpoint

step3: 输入alloc
,按键盘Enter
键确认

- 开始调试
step1: 将alloc符号断点
先置灰
alloc函数在很多地方被调用,在到达我们目标位置前,先置灰。
step2: Xcode开启运行
,程序到达[Person alloc]
断点后, 开启
符号断点。
step3: 点击 Xcode日志栏的继续运行
按钮

可以看到alloc
是调用了底层libobjc.A.dylib
的_objc_rootAlloc
函数。

恭喜你,你已成功找到底层入口
现在你可以选择进入下一篇章,**OC底层原理二:objc4-781编译环境** (真实的底层世界)
方法二:control + step into
step1: 同方法一
一样,保留[Person alloc]
断点,移除符号断点。
step2: 运行程序,进程停留在[Person alloc]
断点处时,
setp3: 按住键盘control
键+鼠标点击 Xcode日志栏的step into
按钮

进去后可以看到objc_alloc
:

step4: 加入objc_alloc
符号断点(参照方法一
的符号断点
操作流程,将内容改为objc_alloc
)

(其实我们已经看到符号断点显示了in libobjc.A.dylib
内容。我们已经找到了底层库
名称)
step5:点击 Xcode日志栏的继续运行
按钮

就找到了libobjc.A.dylib
库,而且看到了底层调用了更深一级的_objc_rootAllocWithZone
。
关于_objc_rootAllocWithZone
与_objc_rootAlloc
的关系,后面解析alloc时,会详细讲到。


方法三: 汇编查找
step1: 同方法一一样,保留[Person alloc]
断点,移除符号断点。Xcode开启运行
,程序到达[Person alloc]
断点后。
step2: 在顶部文件导航栏
打开Debug -> Debug Workflow -> Always show Disassembly
。
这个选项表示始终显示反汇编
。

按图中2种方式都可找到libobjc.A.dylib
底层库


恭喜你,已掌握了三种寻找底层的方法
让我们进入下一篇章,OC底层原理二:objc4-781编译环境** (真实的底层世界)
网友评论