美文网首页
TaggedPointer & Weak

TaggedPointer & Weak

作者: JerrySi | 来源:发表于2020-11-09 21:01 被阅读0次

今天看到一篇文章, 里面介绍到arm64后isa是个联合体,就顺便回顾了下TaggedPointer & Weak。

在 arm64 架构之前, isa就是一个普通的指针, 存储着 Class、Meta-Class 对象的内存地址;
从 arm64 架构开始, 对isa进行了优化, 变成了一个 union , 这8个字节(64位)不仅仅用来放地址值(其中33位), 还使用位域来存储更多的信息;

TaggedPointer

NSNumber对象里面有很多成员变量,为啥只占8个字节呢?

image.png
  • Tagged Pointer并不是真正的对象,而是一个伪对象
    因为Tagged Pointer不是一个真正的对象,所以当你访问它的ISA的时候自然就会报上面的错误了。
    如果一个数超过了Tagged Pointer所能表示的范围,又会怎么处理呢?同样做个试验:

NSNumber *bigNumber = @(0xEFFFFFFFFFFFFFFF);
NSLog(@"%p", bigNumber);

打印结果:

0x6000002310c0

我们发现bigNumber更像一个普通的地址,跟他本身的值并没有什么关系,我们可以打印一下他的ISA,发现是可以打印的:

image.png
结论:
  • 当8字节可以承载用于表示的数值时,系统就会以Tagged Pointer的方式生成指针,如果8字节承载不了时,则又用以前的方式来生成普通的指针。

Weak

Weak的作用、用法这里就不特别介绍了。

当weak引用指向的对象被释放时,又是如何去处理weak指针的呢?
  1. 调用objc_release(其实是AutoreleasePool触发的)
  2. 因为对象的引用计数为0,所以执行dealloc
  3. 在dealloc中,调用了_objc_rootDealloc函数
  4. 在_objc_rootDealloc中,调用了object_dispose函数
  5. 调用objc_destructInstance
  6. 最后调用objc_clear_deallocating,详细过程如下:
a. 从weak表中获取废弃对象的地址为键值的记录
b. 将包含在记录中的所有附有 weak修饰符变量的地址,赋值为 nil
c. 将weak表中该记录删除
d. 从引用计数表中删除废弃对象的地址为键值的记录

设置weak的流程。

设置weak的时候会有old和new 2个哈希表, 如果已经设置过,清除之前的,然后设置新的(weak_register_no_lock)。

weak_register_no_lock

可以看到在weak_entry_t的结构定义中有联合体,在联合体的内部两种方式来存储弱引用对象的指针地址。

  1. 定长数组inline_referrers[WEAK_INLINE_COUNT] WEAK_INLINE_COUNT=4
  2. 动态数组weak_referrer_t *referrers通过out_of_line()
    当弱引用该对象的指针数目小于等于WEAK_INLINE_COUNT时,使用定长数组。当超过WEAK_INLINE_COUNT时,会将定长数组中的元素转移到动态数组中,并之后都是用动态数组存储。

如果referent为nil 或 referent 采用了TaggedPointer计数方式,直接返回,不做任何操作。
如果对象正在析构,则抛出异常。
如果对象不能被weak引用,直接返回nil。
如果对象没有在析构且可以被weak引用,则调用weak_entry_for_referent方法根据弱引用对象的地址从弱引用表中找到对应的weak_entry,如果能够找到则调用append_referrer方法向其中插入weak指针地址。否则新建一个weak_entry。
(没有在析构,同时应该支持weak引用)

相关文章

  • TaggedPointer & Weak

    今天看到一篇文章[https://www.jianshu.com/p/328653ac3921], 里面介绍到ar...

  • 详解获取weak对象的过程

    答案 这里假设,此对象不是TaggedPointer对象,除了一些必要的判断外,在ARC中,获取weak指针时,会...

  • iOS底层探索-内存管理-内存管理方案(TaggedPointe

    内存管理方案 TaggedPointer NONPOINTER_ISA 一、TaggedPointer 2020年...

  • iOS-- 内存管理

    手动目录内存分布及存储静态变量安全taggedPointer特点taggedPointer 演变taggedPoi...

  • TaggedPointer

    TaggedPointer 是为64位cpu开发的技术,目的在于节省内存空间、提升性能。 标签指针通过设置它的最低...

  • TaggedPointer

    TaggedPointer是苹果为了在64位架构的处理器下节省内存和提高执行效率而提出的概念。 如果没有Tagge...

  • TaggedPointer

    TaggedPointer特点: 1,Tagged Pointer专门用来存储小的对象,例如NSNumber和NS...

  • TaggedPointer

    从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSStr...

  • objc 中的Tagged Pointer的应用

    objc使用TaggedPointer的原因 TaggedPointer是一个能够提升性能, 节省内存的技术. N...

  • TaggedPointer/retain/release/dea

    TaggedPointer/retain/release/dealloc/retainCount 分析 ARC &...

网友评论

      本文标题:TaggedPointer & Weak

      本文链接:https://www.haomeiwen.com/subject/wludtktx.html