苹果在64位ARM架构下,对NSNumber等小对象对象的存储做了优化,即使用Tagged Pointer技术。通过使用这种技术,NSNumber指针变量指向的值不再是单独存储在一块内存中,而是对指针本身做了特殊处理,如下图代码所示。

可以看到这些指针一部分直接保存数据(如下图蓝色部分),另一部分作为特殊标记(如图2红色部分),表示这是个特殊指针,不指向任何地址。这么做大大减少了这类值的存储空间,同时提高了它们的创建及读取效率。

当然,如果数据存储部分(7个字节)无法容纳下变量的值,则会按原始的方式,另辟空间去存储值,指针的值仍然是指向这个空间的地址,如下图所示。

参考

  1. 深入理解Tagged Pointer
  2. WWDC 2013 Advanced in Objective-C