作为一位iOS开发者,如何才能开启自己的底层探索之路呢?每当点击系统API无法跟进实现只能浅尝辄止的时候,有没有想过怎样才能看到底层源码的真容,而不是在还没开始就结束了呢?本文中会提供三种方式来一探底层的魅力。
Apple的小心思
这句代码应该非常熟悉了吧?可是想知道alloc
具体是如何实现对象的创建呢?
NSObject *henry = [NSObject alloc];
使用⌘ 左键
你只能看到这些:
没有注释,也再无法跟进,显然Apple不想让你看到底层是如何实现的?可是这样就放弃了吗?
三种源码探索的方式:
- 使用Xcode提供的
符号断点
方式 - 使用Xcode提供的
分步调试
方式 - 通过汇编方式
下面就这三种方式一一说明:
1. 符号断点
- 第一步: 添加符号断点
选择Symbolic Breakpoint
将想要探索的API输入Symbol中
- 第二步:为自己输入的代码增加断点
- 第三步:先关闭符号断点
因为
alloc
系统API,会在很多地方调用,避免影响我们观察。 - 第四步:Run起来吧~
等待系统执行触发
第二步断点
后,我们打开第三步断点
。 这样可以避免绝大多数的干扰。 - 第五步:
libobjc.A.dylib
这个库就是alloc
的源码所在。
- 第六步:下载源码
苹果开源源码汇总
苹果开源源码
建议使用第二个
苹果开源源码
,在里面搜索objc
就可以找到对应的源码仓库进行下载阅读了。
2. 分步调试
如果在你增加了对应API的符号断点
还是无法精确找到源码库名的时候,第一种方式就不够用了。
- 第一步:为自己输入的代码增加断点,run后等待断点触发 这一步与之前的操作相同。
- 第二步:使用
control step into
- 第三步:为
objc_alloc
增加一个符号断点
- 第四步:找到对应源码库名
通过这种方式可以更加精确的找到系统API对应的库名。
3. 汇编方式
- 第一步:为自己输入的代码增加断点,run后等待断点触发 重复步骤
- 第二步:打开汇编开关
第二步需要注意:第一步已经断点已经触发
。否则...
- 第三步:
触发断点下一步是寄存器的处理,无需关注。直接找到callq
的objc_alloc
- 第四步:为
objc_alloc
增加一个符号断点
- 第五步:找到对应源码库名
这一步是最为常用的。
当然还有其他方法,有知道的大佬可以留言指教.
apple源码库
苹果开源源码汇总 苹果开源源码