对象的底层探索(上)

249 阅读1分钟

前言

iOS开发者每天都在使用alloc来创建对象,先来看下面代码及打印:

图片.png

图片.png

我们发现,p、p1、p2三者指向了同一个地址,它们表示同一个对象。那么,alloc在底层到底都做了什么呢?我们来探索一下。

准备

源码: objc4-838.1

源码编译成功后,断点调试:

图片.png

此时,会再次调alloc方法,会按照上面的逻辑再走一次,不过这一次callAlloc方法会走到这里:

图片.png

图片.png

上图的代码中,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字节对齐的方式来确定要分配的空间大小。