问题:对于NSNumber和NSDate一类的变量本身的值所需要的占用的内存大小常常不需要8字节。对于64位系统,NSNumber对象来说, NSNumber对象指针占8字节 + NSNumber对象的值和 isa占16字节 = 24字节 。
实际需要占用24字节,这样内存造成了浪费,效率也不高。
为了解决这个问题,苹果引入了tagged pointer对象,苹果将一个指针拆分成两部分,一部分直接保存数据,另一部分作为特殊标记,表示这是一个特别的指针,不指向任何地方。当8字节可以承载表示的数值时,系统就会以tagged pointer的方式生成指针,如果8字节承载不了,则用以前的方式生成普通指针。
特点
- tagged pointer 专门用来存储小的对象,例如NSNumber和NSDate。
- tagged pointer 指针的值不再是一个地址了,而是真正的值。所以实际上它不再是一个对象,它的内存并不存储在堆中,也不需要malloc和free.
- 并且不支持retain, release操作。
- 在内存读取上有着以前3倍的效率,创建时比以前快106倍。
因此,苹果引入了Tagged Pointer,不但减少了64位机器下的内存占用,还提高了运行效率,完美地解决了小内存对象在存储和访问效率的上的问题。
网友评论