alloc

115 阅读1分钟

alloc 作用


  1. alloc 创建对像申请内存空间-指针

alloc init 和 new


  1. alloc 是开辟内存 生成指针
  2. init 是类的构造方法 是工厂模式的设计
  3. new == callAlloc(self,false)init == [[obj alloc]init]

alloc 如何创建对象


实质上就是alloc的流程 如下:

graph TD
A[alloc]-->B[objc_alloc]
B-->C[callAlloc]
C-->D[_objc_rootAllocWithZone]
D-->E[_class_createInstanceFromZone]
E-->F[instanceSize 计算需要申请的内存大小]
F-->G[calloc 申请内存大小]
G-->H[initIsa 将申请的内存地址指针和isa指针即我们的类绑定起来]
graph TD
A[instanceSize]-->B{如何计算内存大小}
B-->C[fastInstanceSize ]
C-->D[align16]

alloc流程.png

// 计算所需要的内存大小
size_t fastInstanceSize(size_t extra) const
    {
        ASSERT(hasFastInstanceSize(extra));

        if (__builtin_constant_p(extra) && extra == 0) {
            return _flags & FAST_CACHE_ALLOC_MASK16;
        } else {
            size_t size = _flags & FAST_CACHE_ALLOC_MASK;
            // remove the FAST_CACHE_ALLOC_DELTA16 that was added
            // by setFastInstanceSize
            return align16(size + extra - FAST_CACHE_ALLOC_DELTA16);
        }
}
// 进行内存对齐
static inline size_t align16(size_t x) {
    return (x + size_t(15)) & ~size_t(15);
}

寄存器


  1. 存储指针
  2. x0==是第一个参数的传递者 也是返回值的存储地方