1.alloc 流程图 (objc4-756.2源码)
alloc 开辟内存空间,创建 isa
注意细节
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 不可以