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