美文网首页
iOS alloc流程

iOS alloc流程

作者: stormwyl | 来源:发表于2020-09-06 11:51 被阅读0次

    流程根据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流程就结束了。

    相关文章

      网友评论

          本文标题:iOS alloc流程

          本文链接:https://www.haomeiwen.com/subject/ccqcektx.html