Runtime objc4-723 Tagged Pointer & 对象初始化流程

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的结构体声明

对象初始化流程

待完成

发布了139 篇原创文章 · 获赞 35 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/wxs0124/article/details/87981402