当前位置: 首页 > article >正文

iOS - AutoreleasePoolPage 节点为空时的处理逻辑

1. 空 Page 的判断

struct AutoreleasePoolPage {
    id *next;               // 指向下一个可用位置
    id *begin();           // 页面起始位置
    
    bool empty() {
        return next == begin();  // next 指针回到起始位置表示为空
    }
    
    // 页面的边界
    id *begin() { 
        return (id *)(this + 1); 
    }
    id *end() { 
        return (id *)((uint8_t *)this + SIZE); 
    }
};

2. Pop 时的处理

void pop(void *token) {
    AutoreleasePoolPage *page = pageForPointer(token);
    id *stop = (id *)token;
    
    page->releaseUntil(stop);
    
    // 如果 page 变空且不是第一个 page
    if (page->empty() && !page->parent) {
        // 将 page 销毁
        page->kill();
    }
}

3. 销毁机制

void kill() {
    // 确保是在正确的线程上
    assert(thread == pthread_self());
    
    // 解除与父页面的链接
    if (parent) {
        parent->child = nullptr;
    }
    
    // 解除与子页面的链接
    if (child) {
        child->parent = nullptr;
    }
    
    delete this;
}

4. 处理流程

1. 检查是否为空

if (page->empty()) {
    // 页面为空的处理
    if (page->child) {
        // 有子页面时不能删除
        return;
    }
    if (!page->parent) {
        // 是第一个页面时保留
        return;
    }
    // 其他情况可以安全删除
    page->kill();
}

2. 更新热页面

if (hotPage() == page) {
    // 如果当前页面是热页面,需要更新
    setHotPage(page->parent);
}

3. 内存回收

// 页面被销毁时
~AutoreleasePoolPage() {
    // 清理工作
    if (child) child->parent = parent;
    if (parent) parent->child = child;
}

这种机制确保了:

  1. 内存的有效使用
  2. 避免空页面占用资源
  3. 保持页面链表的完整性
  4. 线程安全的处理

http://www.kler.cn/a/470637.html

相关文章:

  • 51单片机——中断(重点)
  • Android存储方案对比(SharedPreferences 、 MMKV 、 DataStore)
  • unity3d-搞个场景漫游如何实现Alpha
  • 定时器PWM模拟DAC计算方法
  • pytorch中nn.Conv2d详解及参数设置原则
  • ffmpeg7.0 合并2个 aac 文件
  • 使用Node编写服务器接口
  • 新型大数据架构之湖仓一体(Lakehouse)架构特性说明——Lakehouse 架构(一)
  • uniapp使用canvas生成订单小票图片
  • 【STM32】点击下载按钮时,提示No ST-LINK detected
  • 创建型模式4.原型模式
  • node.js版本管理之---npm 和 package.json
  • 图像识别-全连接层-卷积层-卷积层的计算-多输入通道场景-多输出通道场景-感受野-填充-VALID 与 SAME-stride-池化-CNN架构
  • 【C语言程序设计——选择结构程序设计】按从小到大排序三个数(头歌实践教学平台习题)【合集】
  • Backend - ADO.NET(C# 操作Oracle、PostgreSQL DB)
  • HCIA-Access V2.5_8_1_EPON原理_PON基本概念
  • 在Linux中,SElinux的作用是什么?如何临时和永久的更改SElinux上下文?
  • Linux buildroot和ubuntu的异同点
  • 支付宝手机网站支付
  • 两万字梳理 | 四足机器人的结构、控制及运动控制
  • VTK 鼠标+键盘重构
  • vulnhub potato靶机
  • HackMyVM-Again靶机的测试报告
  • 【智能算法】改进蚁狮优化算法【matlab】
  • arkTs数据存储
  • Visual Studio 2022 C++ gRPC 环境搭建