ToB企服应用市场:ToB评测及商务社交产业平台

标题: iOS中 Tagged Pointer 技术 [打印本页]

作者: 温锦文欧普厨电及净水器总代理    时间: 2022-9-2 15:16
标题: iOS中 Tagged Pointer 技术
前言:

​        从64位开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储。
Tagged Pointer主要为了解决两个问题:
Tagged Pointer特点:
一、引入Tagged Pointer 前后对比


1、引入前

NSNumber等对象需要动态分配内存、维护引用计数等。 总共的空间= 指针空间 + 堆中分配的空间
2、引入后

NSNumber等对象,只需要分配一个指针即可,这个指针内部会包含这些数据内容。
总空间 = 指针空间
因为不用去用对象的方式管理引用计数,所以省却了 retain,release操作。
二、Tagged Pointer 原理

number1只有栈上的指针内存;而maxNum不仅有指针内存,在堆中还分配了32字节的内存用于存储该变量的值。通过观察发现,对象的number1、number2、number3、number4都存储在了对应的指针中;而maxNum不同由于数据过大,导致无法 1 个指针 8 个字节的内存根本存不下,而申请了32字节堆内存。
三、如何判断是否使用了 Tagged Pointer 技术
  1. BOOL isTaggedPointer(id pointer) {
  2.     return (long)(__bridge void *)pointer & 1;
  3. }
复制代码
该函数就是调用了isTaggedPointer。
四、使用 Tagged Pointer 注意点

​        我们知道,所有OC对象都有isa指针,而Tagged Pointer并不是真正的对象,它没有isa指针,所以如果你直接访问Tagged Pointer的isa成员的话,在编译时将会有警告。
五、面试题

[code]dispatch_queue_t queue = dispatch_get_global_queue(0, 0);    for (int i = 0; i




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4