返回

iOS内存管理揭秘:Tagged Pointer Format的变化

IOS

64位时代,我们并没有真正使用到处理器提供的全部位数;在真正的对象指针中,我们只用到了中间的那些位。由于对齐要求的存在,低位始终为0,对象必须总是位于指针大小倍数的地址中。

因此,iOS引入了Tagged Pointer Format,它巧妙地利用了指针的闲置位,将一些对象属性信息编码在指针中,从而优化内存管理。

Tagged Pointer Format

Tagged Pointer Format(TPF)是一种内存管理技术,它将指针的低位用于存储有关对象的元数据信息,例如对象的类型、引用计数或其他标记。

通过这种方式,TPF允许我们直接从指针中获取有关对象的信息,而无需额外的查找操作,从而提高了内存管理的效率。

TPF在iOS中的演变

在早期版本的iOS中,TPF使用了一比特来表示对象的类型。这允许将对象划分为两类:TaggedUntagged

Tagged对象包含额外的元数据,而Untagged对象则没有。这种简单的二分法在当时提供了足够的灵活性。

然而,随着iOS的不断发展,出现了对更精细的对象分类的需求。为了满足这一需求,iOS 11引入了新的TPF格式,该格式使用两个比特来表示对象的类型。

这种新的格式将对象划分为四类:

  1. Tagged Pointer:包含附加元数据
  2. Untagged Pointer:不包含附加元数据
  3. Weak Pointer:指向一个可以被释放的对象
  4. Unowned Pointer:指向一个由其他对象所有权的对象

TPF的好处

TPF为iOS内存管理带来了多项好处:

  • 性能优化: 通过消除查找操作,TPF提高了内存管理的效率,从而减少了处理器的开销。
  • 空间节省: TPF允许在指针中存储元数据,从而减少了对其他数据结构的需求,从而节省了内存空间。
  • 代码简化: TPF简化了内存管理代码,使开发人员可以专注于应用程序逻辑,而无需担心底层细节。

示例

让我们考虑一个NSString对象。在TPF中,NSString对象指针的低两个位可能被编码为00,表示该对象为Untagged对象,不包含额外的元数据。

如果我们将该NSString对象分配给一个weak变量,那么指针的低两个位将被编码为10,表示该对象为Weak对象,指向一个可以被释放的对象。

结论

Tagged Pointer Format(TPF)是iOS中一项关键的内存管理技术,它通过在指针中编码对象属性信息,优化了内存管理。

随着iOS的不断发展,TPF也随之演变,提供更精细的对象分类和更高的效率。

通过了解TPF,开发人员可以优化其应用程序的内存管理,提高性能并节省宝贵的内存空间。