美文网首页
ios weak 源码资料

ios weak 源码资料

作者: YM_1 | 来源:发表于2020-05-29 13:41 被阅读0次

    有空整理 摘要

    isa 结构体

    hasweaklyref
    has coxx
    sidetable_rc
    refcount

    引用计数小 直接存在 isa的 refcount
    如果查过极限值 分一半存到 sideTable中

    全局一张 sideTables,sideTables 含有固定的 64张 sideTable

    sideTable 结构含有
    lock 自旋锁
    refcnts 对象引用计数 (对象地址,引用计数)
    weakTable (对象弱引用计数)

    weakTable_t

    weakTable 含有 numCount,含有有多少个 weak 对象
    weakTable 含有 entry hash 数组
    mask 用于求元素的hash算法需要的值
    max_hash_displacement 最大冲突次数

    weakTable 容量超过3/4 扩容 2倍 或者 64
    容量紧缩 总容量大于 1024,但实际使用不足1/16时,减小容量为 1/8

    weak_entry 中
    如果小于4个 直接存放四个进入数组
    大于四个,分配一个动态大小的数组,标记启用动态数组。
    数组扩容 容量超过3/4 扩容 2倍 或者 8 没有缩小的方法

    root_dealloc
    判断是否有c++析构函数
    弱引用
    绑定对象

    调用析构函数
    解除绑定
    弱引用表 查询
    置为nil

    __block

    被block捕获的正常对象 值拷贝
    __block 对象会从新生成一个结构体

    {
    id forwarding
    id
    }

    __block int b = 10

    b = 11

    b->forwarding->b = 11

    block拷贝到堆上,栈中的 forwarding 指向 堆上的地址且所有都替换为
    b->forwarding->b

    block 中
    ^{ b = nil } 执行完后的代码中再次执行 self
    代表 b-> forwarding-> b = nil
    b-> forwarding 引用的 b 断开了链接。
    b 如果没有其他引用,就会被 release掉
    然后继续访问 b,会访问一块废弃的地址造成 野指针。

    文章
    Objective-C runtime机制(5)——iOS 内存管理

    Objective-C runtime机制(6)——weak引用的底层实现原理

    Objective-C runtime机制(7)——SideTables, SideTable, weak_table, weak_entry_t

    相关文章

      网友评论

          本文标题:ios weak 源码资料

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