Runtime objc4-723 Tagged Pointer & 对象初始化流程
Tagged Pointer
传统意义上,指针的值制式一个内存地址,它本身并没有什么意义,但是在Apple用了64位的系统后,一个指针就会有8个字节 64位,这么长的内容只表示一个地址是很浪费的。
所以为了优化这个问题,Tagged Pointer概念被提出来,它的出现让一个指针的值富有了非地址之外的其他内容,举个例子:
NSNumber *number1 = @1;
NSNumber *number2 = @3;
NSNumber *number3 = @54;
(lldb) p number1
(__NSCFNumber *) $3 = 0xb000000000000012 (int)1 (lldb) p number2
(__NSCFNumber *) $4 = 0xb000000000000032 (int)3 (lldb) p number3
(__NSCFNumber *) $5 = 0xb000000000000362 (int)54
指针0xb000000000000012去除前边的0xb
和 后边的1
用16进制表达就是2
可以看出,指针的字面量值就是变量表示的实际值。
这样的操作让很多对象的创建可以忽略,省去malloc
free
的过程,极大地提升了效率
isa_t
struct {
uintptr_t nonpointer
uintptr_t has_assoc
uintptr_t has_cxx_dtor
uintptr_t shiftcls
uintptr_t magic
uintptr_t weakly_referenced : 1; uintptr_t deallocating : 1; uintptr_t has_sidetable_rc : 1;
uintptr_t extra_rc : 19;
};
这是isa_t
的结构体声明
对象初始化流程
待完成