iOS 底层探索篇 —— 内存字节对齐分析
LLVM拦截优化
上一篇说到alloc流程,第一步应该是alloc方法,那么实际上是不是这样呢?我们验证一下:
我们在alloc的地方打个断点,运行一下:

打开汇编:

发现这里实际上走的是objc_alloc,这是为什么呢?
我们搜索一下objc_alloc,发现在objc-runtime-new.mm文件中发现这样一个fixupMessageRef函数,发现当msg的SEL等于alloc的时候,就会把msg的实现改为objc_alloc.

寻找一下是哪里调用的fixupMessageRef,发现是在_read_images方法里面。

我们看到,fixupMessageRef是有问题的时候,才去修改,那么alloc没有问题的时候为什么也是调用objc_alloc呢?如果在readImage之前,那么说明可能是在编译的时候就做了处理,所以这里去看一下llvm源码。
接下来在llvm源码中搜索objc_alloc,看到了这样一段注释:

就是当这个方法返回true的时候,alloc会被改为objc_alloc, allocWithZone:nil 会被改为objc_allocWithZone。
来看一下这个方法,得知什么时候会返回true,发现是用version来进行判断的。

继续往下看,发现了这样一段代码。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



