前言
iOS开发者每天都在使用alloc来创建对象,先来看下面代码及打印:
我们发现,p、p1、p2三者指向了同一个地址,它们表示同一个对象。那么,alloc在底层到底都做了什么呢?我们来探索一下。
准备
源码: objc4-838.1
源码编译成功后,断点调试:
此时,会再次调alloc方法,会按照上面的逻辑再走一次,不过这一次callAlloc方法会走到这里:
上图的代码中,size = cls->instanceSize(extraBytes)就是来计算需要给该对象分配的内存空间的大小。
inline size_t instanceSize(size_t extraBytes) const {
if (fastpath(cache.hasFastInstanceSize(extraBytes))) {
return cache.fastInstanceSize(extraBytes);
}
size_t size = alignedInstanceSize() + extraBytes;
// CF requires all objects be at least 16 bytes.
if (size < 16) size = 16;
return size;
}
其中,fastInstanceSize(extraBytes)表示有缓存的情况下,按照16字节对齐的方式得到的一个空间大小,而size_t size = alignedInstanceSize() + extraBytes表示无缓存的情况下,按照8字节对齐的方式计算得到的大小,最小为16字节。最后通过_class_createInstanceFromZone方法中obj = (id)calloc(1, size)来创建对象并返回,在calloc中采用的是16字节对齐的方式来确定要分配的空间大小。