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来进行判断的。
继续往下看,发现了这样一段代码。