摘要:背景对于位系统,为了节省内存和提高执行效率,苹果提出了的概念。因为并不是真正的对象,没有指针。内存读取和对象创建效率高。类型最高位表示类型,最低位表示字符串长度。
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 是 iOS 中管理引用计数的技术,帮助 iOS 实现垃圾自动回收,具体实现的原理是由编译器进行管理的,同时运行时库协助编译器辅助完成。主要涉及到 Cla...
摘要:早期引用计数的内存管理继承自,拥有一套基于对象引用计数的内存管理体系。这种引用计数的思想在很多地方也有应用,不过本质上说,仍然是需要程序员来手动管理计数的,只不过当计数值清零时,对象会被自动释放罢了。 原文:Objective-c 内存管理的历史和参考资料 对于像我这样自学IOS开发的初学者,网上有很多资料,很多教程,但是过于多的资料也使初学者无法筛选合适自己的。并且Objectiv...
摘要:所以从开始,苹果引入了机制,即自动引用计数,这才把开发者们从引用计数中解放出来,而原来的方式就称为了,即手动引用计数。但是作为一名合格的开发人员,个人认为还是有必要了解一些关于引用计数的知识的,这也是知乎出这道题的意义。 0x00 问题的引入 前一阵子表哥给了我一道知乎的iOS开发岗位面试题,听说还是那种类似于一票否决的题目,考察应试者的编程能力。我仔细一看是关于MRC的一道题,也就是...
摘要:为了解决这个问题,苹果依然保留了的那种弱引用方式。所以,无论苹果,还是有经验的程序员,都建议能不用就尽量不用,能缩短范围就尽量缩短范围。于是突发奇想,想对苹果问一个为什么即苹果为什么要搞一个任何一件事情,都不是毫无来由的。 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处。...
摘要:它们有阅读原文从源码探索的实现原理对于重复的,其多次触发的时刻不是一开始算好的,而是触发后计算的。设置了的,对于和系统,实质上会采用的形式注册到内核中,触发后,再由处理其回调逻辑阅读原文更多源码更多博文 iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件 showImg(https://segmentfault.com/img/remote/146000...
阅读 2030·2021-11-23 09:51
阅读 3529·2021-11-11 10:57
阅读 1206·2021-10-09 09:43
阅读 2229·2021-09-29 09:35
阅读 1807·2019-08-30 15:54
阅读 1683·2019-08-30 15:44
阅读 3034·2019-08-30 13:20
阅读 1587·2019-08-30 11:19