Renhua's Blog

Stay Hungry. Stay Foolish

0%

iOS-基础知识整理

iOS 基础知识整理

1. Tagged Pointer

概括:将本来用于存储对象指针的空间存储数据,以节省空间、提高效率。

在 32 位设备中,NSNumber、NSDate 这类对象占用的空间是 8 字节(对象指针 4 字节 + 对象值 4 字节),而到 64 位设备中,占用的空间则是 16 字节(对象指针 8 字节 + 对象值 8 字节),空间上翻了一倍。效率上,NSNumber、NSDate 会在堆上分配空间存储对象的值,同时还要维护对象的引用计数进行销毁释放,效率不高。

为了解决上述问题,苹果提出 Tagged Pointer 对象。原理就是将对象指针分为两部分,一部分用于存储对象的值,一部分存储特殊标记(标记是 Tagged Pointer 对象)。在 64 位设备中,占用的空间变为 8 字节 (对象值 & 特殊标记 8 字节),这样在内存中就省掉了在堆中存储对象值的空间,同时也省掉了维护对象所需要的开销。

但是 8 字节存储的数据也是有限的,所以如果数据超过了 8 字节,Tagged Pointer 对象还是会按照 “对象指针 8 字节 + 对象值 8 字节” 方式存储。

2. Assign 修饰符导致的野指针

assign 一般用来修饰基础数据类型,尽量不用它修饰对象,因为 assign 修改对象并不会使引用计数 +1,会被 ARC 及时清除,但此时 assign 的指针地址依然存在,就会造成野指针。