一、底层探索分析的三种方法
方法一:直接添加符号断点。
方法二:打了普通断点以后,跑到断点处,按住control,step into,进去后查看到调用方法名,将方法名添加一个符号断点,再执行即可查找到底层库。
方法三:打了普通断点以后,跑到断点处,点击顶部Debug—Debug Workflow — Always Show Dissassembly(汇编);再下一行找到方法名打断点,然后再step into。
二、编译器优化
Project中 Build Setting,搜索opt,全称optimization(最优化),中的Debug项,改成和release一致的 Fastest&Smallest。
这样从汇编代码中可以看出代码省了一半多。
三、alloc、init、new
init: return (id)self; 实际是一个构造方法,一个入口方便供用户去重写。
new:
+ (id)new {
return [callAlloc(self, false/*checkNil*/) init];
}
callAlloc是+alloc其中的一个方法,传入了self,那么就new就相当于 (alloc init).
注意:其实不太建议直接调用new方法,因为如果开发者重写了init方法,其中包含其他自定义的东西,那么直接new就和init有区别了,这点要特别注意。
作业:为什么在普通类的alloc流程里打断点,[NSObject alloc]的时候却走不进去。
答:因为NSObject走的是objc_alloc。
流程图如下
附objc4-787.1源码编译调试避坑链接:https://blog.csdn.net/miaocuilin/article/details/115631795