服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS源码阅读必备知识之Tagged Pointer

iOS源码阅读必备知识之Tagged Pointer

2021-05-04 17:14Dexterxiee IOS

这篇文章主要给大家介绍了关于iOS源码阅读必备知识之Tagged Pointer的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

tagged pointer 介绍

苹果对于tagged pointer特点的介绍:

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

为什么要引入tagged pointer

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

iOS源码阅读必备知识之Tagged Pointer

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

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

tagged pointer

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

我们可以将一个对象的指针拆成两部分,一部分直接保存数据,另一部分作为特殊标记,表示这是一个特别的指针,不指向任何一个地址。所以,引入了tagged pointer对象之后,64位cpu下nsnumber的内存图变成了以下这样:

tagged pointer

iOS源码阅读必备知识之Tagged Pointer

测试

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import
 
int main(int argc, const char * argv[]) {
 @autoreleasepool {
 // insert code here...
 nsnumber *number1 = @1;
 nsnumber *number2 = @2;
 nsnumber *number3 = @3;
 nsnumber *numberffff = @(0xffff);
 
 nsnumber *numberlager = @(maxfloat);
 
 nslog(@"number1 pointer is %p", number1);
 nslog(@"number2 pointer is %p", number2);
 nslog(@"number3 pointer is %p", number3);
 nslog(@"numberlager pointer is %p", numberlager);
 
 /*
 2017-03-10 12:07:50.731726 taggedpoint[1690:50438] number1 pointer is 0x127
 2017-03-10 12:07:50.731992 taggedpoint[1690:50438] number2 pointer is 0x227
 2017-03-10 12:07:50.732011 taggedpoint[1690:50438] number3 pointer is 0x327
 2017-03-10 12:07:50.732043 taggedpoint[1690:50438] numberlager pointer is 0x1002006a0
 */
 
 
 }
 return 0;
}

以 0x127 为例 去掉 tag27(假设27为标记) 0x1 就是number 的值。

0x227

0x327

都有这种规律

numberlager 存储的值为maxfloat 显然超过了tagged pointer 可以存储的范围。

所以打印的地址是单纯的指针地址,指向存储numberlager的内存地址。

对于isa指针的影响

因为tagged pointer 不是一个真正的对象,如果使用isa指针在编译时会报错。

如图:

iOS源码阅读必备知识之Tagged Pointer

提示我们改为object_getclass()

object_getclass()中做了相应的处理

由于object_getclass()没有对应的实现,只能从其他地方窥探一二

objc-weak.mm

?
1
2
3
4
5
6
7
weak_read_no_lock(weak_table_t *weak_table, id *referrer_id)
{
 objc_object **referrer = (objc_object **)referrer_id;
 objc_object *referent = *referrer;
 if (referent->istaggedpointer()) return (id)referent;
 //...
}
?
1
2
3
4
5
6
7
8
9
inline bool
objc_object::istaggedpointer()
{
#if support_tagged_pointers
 return ((uintptr_t)this & tag_mask);
#else
 return false;
#endif
}

这里取对象的值做了一些判断

如果是tagged pointer , 对象的值就是指针

如果非tagged pointer , 对象的值是指针指向的内存区域中的值

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://juejin.im/post/58fe0c6561ff4b006671e789

延伸 · 阅读

精彩推荐
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28