源码编辑器下载r对象” alt=”[iOS开发]Tagged Pointer对字符型变量象” src=”https://www.6hu.cc/files/2022/06/260dd503b20e99f07a96aecb0f2f0fc6.p变量之间的关系ng”>
[iOS开发]Tagged Pointer对象源码1688“https://www.6hu.cc/files/2022/06/2f56a2c变量类型有哪些59e6bd1c7bee71b8ab4cddd60.png”> 可以看出,解析出来的tag就对应着它们的类型,看一下解析tag的方法:

static inline objc_tag_index_t
_objc_getTaggedPointerTag(const void * _Nullable ptr)
{
    // ASSERT(_objc_isTaggedPointer(ptr));
    uintptr_t value = _objc_decodeTaggedPointer(ptr);
    uintptr_t basicTag = (value >> _OBJC_TAG_INDEX_SHIFT) & _OBJC_TAG_INDEX_MASK;
    uintptr_t extTag =   (value >> _OBJC_TAG_EXT_INDEX_SHIFT) & _OBJC_TAG_EXT_INDEX_MASK;
    if (basicTag == _OBJC_TAG_INDEX_MASK) {
        return (objc_tag_index_t)(extTag + OBJC_TAG_First52BitPayload);
    } else {
        return (objc_tag_index_t)basicTag;
    }
}

解析出来的pointerValue就代表着他们的值:NSNumber类后一位前的十六进制代表它们的真实值;NSS字符间距tring最后一位代表字符串长度,后面每两位代表多线程ASCII码值。 当8字节可以承载用于表示的数值时,系统就会以 Tagged Pointer 的方式生成指针,如果8字节承载不了时,则又用以前的方式来生成普通多线程是什么意思的指针。

特点

我们也可以看到苹果对于Tagged Pointer 特点的介绍:

  1. Tagg字符串逆序输出ed Pointer 专门用来存储小的对象,例如 NSNumberNS字符间距Date
  2. Tagged Pointer 指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象

了,它只是一个披着对象“皮”的普通变量而己。所以,它的内存并不存储在堆中,也 不需要 mallocfree。 3. 在内存读取上有着以前3倍的效率,创建时比以前快 106倍

因此,苹果引入 Tagged Pointer,字符间距在哪里设置不但减少了 64位机器下程序的内存占用,还提高了运行效率,完美地解决了小内存对象在存储和访问效率上的问题。

注意事项

isa指针

Tagged Pointer 的引入也带来了问题字符间距在哪里设置,即 Tagged Pointer 并不是真正的对象,而是一个伪对象,所多线程的应用场景以你如果完全把它当成对象来使用,可能会让它“露马脚”。在上一章中我们写道,所有对象都有isa 指针,而 Tagged Pointer 其实是没有的,多线程是什么因为它不是真正的对象。

64位下的isa指针优化

对于 64位设备,苹果除了引人 Tagg效率符号ed Pointer 来优化小的对象外,对于普通的对象,其多线程的实现方式isa指针也进行了优化和调整。在32 位环境下,对象的引用计数都保存在一个外部的表中,每一个变量之间的关系对象的 Retain 操作,实际上包括如下 5个步骤:

  1. 获得全局的记录引用计数的hash 表。
  2. 为了线程安全,给该hash 表加锁。
  3. 查找到目标对效率公式象的引用计数值。
  4. 将该引用计数值加1,写回hash 表。
  5. 给该hash 表解锁。

从上面的步骤我们可以看出,为了保证源码交易平台线程安全,对引用计数的增减操作都要先锁定这个表,这从性能上看变量类型有哪些是非常差的。 而在 64 位环境下,isa 指针也是64 位,实际作为指针部分只用到的其中33位,剩余的 31位苹果使用了类似 Tagged Poin多线程并发中线程的状态ter 的概念,其中 19 位将保存对象的引1用计数,这样对引用计数的操作只需要修改源码这个指针即可。只有当引用计数超出19位,才会将引用计数保存到外部表,而这种情况是很少的,所以这样引用计数的更改效率会更高。 与前面的5个步骤对应,在64位字符间距怎么加宽环境下,新的 Ret多线程是什么ain 操作包括如下 5个步骤:

  1. 检查 isa 指针上面的标记位,看引1用计数是否保存在 isa变量中,如果不是,则使用以前

的步骤,否则执行第2步 2. 检查当前对象是源码编辑器下载否正在释放,如果是,则不做任何事情。 3. 增加该对象的变量类型有哪些引用计数,但是并不马上写回到isa 变量中。 4. 检杳增加后的引用计数的值是否能够被 19 位表示,如果不是,则切换成以前的办法,否 则执行第5步。 5. 进行一个原子的写操作,源码之家isa 的值写回。

虽然步骤都是 5步,但是由于没有了全局的加锁操作,所以引用源码编程器计数的更改更快了。