iOS alloc到底做了什么

alloc 流程图

iOS alloc到底做了什么_第1张图片

注意细节

1.size = cls->instanceSize(extraBytes)


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.
// 最少16字节,防止野指针
if (size < 16) size = 16;
	return size;
}

// 字节对齐
uint32_t alignedInstanceSize() const {
	return word_align(unalignedInstanceSize());
}
// 字节对齐,8字节对齐 WORD_MASK 64位系统 7
#   define WORD_MASK 7UL
static inline uint32_t word_align(uint32_t x) {
    return (x + WORD_MASK) & ~WORD_MASK;
}

2.init 与new

- (id)init {
    return _objc_rootInit(self);
}

+ (id)new {
    return [callAlloc(self, false/*checkNil*/) init];
}

init 其实什么也没有做,直接返回了对象
new 就是在调用alloc 与 init
区别是 init 可以重写,new 不可以

你可能感兴趣的:(iOS)