资讯专栏INFORMATION COLUMN

iOS内存管理-TaggedPointer

Travis / 2449人阅读

摘要:背景对于位系统,为了节省内存和提高执行效率,苹果提出了的概念。因为并不是真正的对象,没有指针。内存读取和对象创建效率高。类型最高位表示类型,最低位表示字符串长度。

1.背景

对于64位系统,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念。

2.特点

苹果的64位Objective-C实现中,若对象指针的最低有效位为奇数,则该指针为Tagged Pointer。

Tagged Pointer专门用来存储小的对象,例如NSNumber/NSDate和NSString。

Tagged Pointer指针的值不是地址,包含真正的值和对象类型信息。所以,实际上它不是一个对象,而是一个披着对象皮的普通变量。它的内存并不存储在堆中,也不需要malloc和free。

Tagged Pointer因为并不是真正的对象,没有isa 指针。

内存读取和对象创建效率高。

3.说明
    NSNumber *number = @25; //number地址:0xb000000000000192,解释:b:NSNumber类型,25的16进制是19,2:整型
    NSString *a = @"a"; // a的地址:0x10be1f340
    NSString *b = [a mutableCopy]; // b的地址:0x6080002542b0
    NSString *c = [b copy]; // c的地址:0xa000000000000611 为Tagged Pointer。"a"的ASCII码值为61(十六进制)

NSNumber类型:最高4位的“b”表示是NSNumber类型,最低4位(Int为2,long为3,float为4,double为5)表示基本数据类型,其余56位则用来存储数值本身内容。存储用的数值超过56位存储上限的时候,那么NSNumber才会用真正的64位内存地址存储数值,然后用指针指向该内存地址。

NSString类型:最高位表示类型,最低位表示字符串长度。而其余的56位也是用来存储数据内容。

NSString类型:当字符串内存长度超过了56位的时候,Tagged Pointer并没有立即用指针转向,而是用了一种算法编码,把字符串长度进行压缩存储,当这个算法压缩的数据长度超过56位了才使用指针指向。

NSString类型:当String的内容有中文或者特殊字符(非 ASCII 字符)时,那么就只能存储为String指针。

NSString类型:字面型字符串常量却从不存储为Tagged Pointer,因为字符串常量必须在不同的操作系统版本下保持二进制兼容,而Tagged Pointer在运行时总是由Apple的代码生成。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17017.html

相关文章

  • 理解 ARC 实现原理

    摘要:是中管理引用计数的技术,帮助实现垃圾自动回收,具体实现的原理是由编译器进行管理的,同时运行时库协助编译器辅助完成。本文主要内容由修饰符拓展开,分别延伸出引用计数弱引用表自动释放池等实现原理。判断使用了优化处理则返回对象,否则引用计数。ARC 是 iOS 中管理引用计数的技术,帮助 iOS 实现垃圾自动回收,具体实现的原理是由编译器进行管理的,同时运行时库协助编译器辅助完成。主要涉及到 Cla...

    lavor 评论0 收藏0
  • Objective-C 内存管理的历史和参考资料

    摘要:早期引用计数的内存管理继承自,拥有一套基于对象引用计数的内存管理体系。这种引用计数的思想在很多地方也有应用,不过本质上说,仍然是需要程序员来手动管理计数的,只不过当计数值清零时,对象会被自动释放罢了。 原文:Objective-c 内存管理的历史和参考资料 对于像我这样自学IOS开发的初学者,网上有很多资料,很多教程,但是过于多的资料也使初学者无法筛选合适自己的。并且Objectiv...

    cartoon 评论0 收藏0
  • iOS中的Reference Counting详解

    摘要:所以从开始,苹果引入了机制,即自动引用计数,这才把开发者们从引用计数中解放出来,而原来的方式就称为了,即手动引用计数。但是作为一名合格的开发人员,个人认为还是有必要了解一些关于引用计数的知识的,这也是知乎出这道题的意义。 0x00 问题的引入 前一阵子表哥给了我一道知乎的iOS开发岗位面试题,听说还是那种类似于一票否决的题目,考察应试者的编程能力。我仔细一看是关于MRC的一道题,也就是...

    Hujiawei 评论0 收藏0
  • iOS内存管理:从MRC到ARC实践

    摘要:为了解决这个问题,苹果依然保留了的那种弱引用方式。所以,无论苹果,还是有经验的程序员,都建议能不用就尽量不用,能缩短范围就尽量缩短范围。于是突发奇想,想对苹果问一个为什么即苹果为什么要搞一个任何一件事情,都不是毫无来由的。 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处。...

    PingCAP 评论0 收藏0
  • iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码

    摘要:它们有阅读原文从源码探索的实现原理对于重复的,其多次触发的时刻不是一开始算好的,而是触发后计算的。设置了的,对于和系统,实质上会采用的形式注册到内核中,触发后,再由处理其回调逻辑阅读原文更多源码更多博文 iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件 showImg(https://segmentfault.com/img/remote/146000...

    cod7ce 评论0 收藏0

发表评论

0条评论

Travis

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<