iOS alloc流程

2020-09-06  本文已影响0人  stormwyl

流程根据objc4-781源码分析

alloc会先调用_objc_rootAlloc()函数,_objc_rootAlloc()中会调用callAlloc函数,然后会调用_objc_rootAllocWithZone(),最终会执行到_class_createInstanceFromZone()中,主要的申请内存逻辑在这个函数中。

1. 首先会获取要申请的类的size

size = cls->instanceSize(extraBytes);

首先是看是否有缓存,如果有缓存的话,就会执行缓存查找

cache.fastInstanceSize(extraBytes);

__builtin_constant_p()是编译器内置函数,判断参数是不是编译时常量,alloc的时候不会执行这个判断的代码,通过_flags获取size,然后对size执行16字节对齐,为何要减去FAST_CACHE_ALLOC_DELTA16呢?我认为是因为缓存的是16字节对齐之后的size,通过减去FAST_CACHE_ALLOC_DELTA16去修正。

如果没有缓存就会通过类本身属性获取类大小,获取大小后也会进行16字节对齐。

size_t size = alignedInstanceSize() + extraBytes;

2. 接下来会通过calloc申请内存。

if(zone) {

        obj = (id)malloc_zone_calloc((malloc_zone_t *)zone,1, size);

    }else{

        obj = (id)calloc(1, size);

    }

3. 最后将内存和类信息进行绑定

if(!zone && fast) {

        obj->initInstanceIsa(cls, hasCxxDtor);

    }else{

        // Use raw pointer isa on the assumption that they might be

        // doing something weird with the zone or RR.

        obj->initIsa(cls);

    }

alloc流程就结束了。

上一篇 下一篇

猜你喜欢

热点阅读