weak原理 添加弱引用流程总结 自动释放池

weak原理

weak在底层维护了⼀张weak_table_t结构的hash表,key是所指对象的地址,value是weak指针的

地址数组。weak所引⽤对象的引⽤计数不会加1,对象释放时,会根据对象地址获取所有weak指针

地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除。

添加弱引⽤流程总结:

  1. 如果被弱引⽤的对象为nil 或这是⼀个TaggedPointer,直接返回,不做任何操作。
  2. 如果被弱引⽤对象正在析构,则抛出异常。
  3. 如果被弱引⽤对象不能被weak引⽤,直接返回nil。
  4. 如果对象没有再析构且可以被weak引⽤,则调⽤weak_entry_for_referent ⽅法根据弱引⽤对象的地址从弱引⽤表中找到对应的weak_entry,如果能够找到则调⽤append_referrer ⽅法向其中插⼊weak指针地址。否则新建⼀个weak_entry。

移除弱引⽤流程总结:

  1. ⾸先在weak_table中找出被弱引⽤对象对应的weak_entry_t。 
  2. 在weak_entry_t中移除weak指针地址。
  3. 移除元素后,判断此时weak_entry_t中是否还有元素,如果此时weak_entry_t已经没有元素了,则需要将weak_entry_t从weak_table中移除。

⾃动释放池

AutoreleasePool(⾃动释放池)是OC中的⼀种内存⾃动回收机制,它可以延迟加⼊

AutoreleasePool中的变量release的时机。在正常情况下,创建的变量会在超出其作⽤域的时候

release,但是如果将变量加⼊AutoreleasePool,那么release将延迟执⾏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值