本文介绍: 指针也是64 位,实际作为指针部分只用到的其中33位,剩余的 31位苹果使用了类似 Tagged Pointer 的概念,其中 19 位将保存对象的引1用计数,这样对引用计数的操作只需要修改这个指针即可。Tagged Pointer 的引入也带来了问题,即 Tagged Pointer 并不是真正的对象,而是一个伪对象,所以你如果完全把它当成对象来使用,可能会让它“露马脚”。的普通变量,那么它所占用的内存是与CPU的位数有关,在32位CPU下占4个字节,在64位CPU下是占8个字节的。
本来打算细看一下weak的底层原理,看到了出现了很多次Tagged Pointer对象,就先来学一下Tagged Pointer,在之前刚学习OC的时候,学习NSString三种类型的时候,接触过这个类型,但是没有往下细看,现在来细看看:
关于Tagged Pointer
在2013年9月,苹果推出了iPhone5s,与此同时,iPhone5s配备了首 个采用64位架构的A7双核处理器,为了节省内存和提高执行效率,苹果提出了Tagged Pointer
的概念。先看看原有的对象为什么会浪费内存。假设要存储一个NSNumber
对象,其值是一个整数。正常情况下,如果这个整数只是一个NSInteger
的普通变量,那么它所占用的内存是与CPU的位数有关,在32位CPU下占4个字节,在64位CPU下是占8个字节的。而指针类型的大小通常也是与CPU位数相关,一个指针所占用的内存在32位CPU下为4个字节,在64位CPU下也是8个字节。所以一个普通的iOS程序,如果没有Tagged Pointer
对象,从32位机器迁移到64位机器中后,虽然逻辑没有任何变化,但这种NSNumber
、NSDate
一类的对象所占用的内存会翻倍。
Tagged Pointer
专门用来存储小的对象,例如NSNumber
和NSDate
Tagged Pointer
指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已。所以,它的内存并不存储在堆中,也不需要malloc
和free
。
在内存读取上有着3倍的效率,创建时比以前快106倍。
NSTaggedPointer示例
TaggedPointer 结构
Tagged Pointer特点
注意事项
isa指针
64位下的isa指针优化
我们来看一个经典的面试题:
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。