深入探究 Objective-C Target Point

本文深入探讨了Objective-C中的Tagged Pointer,一种用于存储小对象如NSNumber和NSDate的技术。Tagged Pointer提高了内存读取效率,减少了对象创建的时间,并解决了64位系统中对象内存占用的问题。通过将对象的指针拆分为数据和特殊标记两部分,避免了不必要的内存分配和管理。在测试中,当数值超出Tagged Pointer的存储范围时,会返回正常的对象地址。此外,由于Tagged Pointer不是真正对象,使用isa指针会报错,需要改用object_getClass()来获取类。
摘要由CSDN通过智能技术生成

Tagged Pointer 介绍

苹果对于Tagged Pointer特点的介绍:

  1. Tagged Pointer专门用来存储小的对象,例如NSNumber和NSDate
  2. Tagged Pointer指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已。所以,它的内存并不存储在堆中,也不需要malloc和free。
  3. 在内存读取上有着3倍的效率,创建时比以前快106倍。

为什么要引入Tagged Pointer

iPhone5s 采用64位处理器。
对于64位程序,我们的数据类型的长度是跟CPU的长度有关的。

64位 32位
int 8byte int 4byte

这样就导致了 一些对象占用的内存会翻倍。

同时 维护程序中的对象需要 分配内存,维护引用计数,管理生命周期,使用对象给程序的运行增加了负担。

Tagged Pointer

为了改进上面提到的内存占用和效率问题,苹果提出了Tagged Pointer对象。由于NSNumber、NSDate一类的变量本身的值需要占用的内存大小常常不需要8个字节,拿整数来说,4个字节所能表示的有符号整数就可以达到20多亿(注:2^31=2147483648,另外1位作为符号位),对于绝大多数情况都是可以处理的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值