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

news/2025/1/7 23:31:26/

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 变空且不是第一个 pageif (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.ppmy.cn/news/1561397.html

相关文章

【数据库系统概论】数据库设计--复习极简总结版

一、数据库设计概述 数据库应用系统:使用数据库的各类信息系统。数据库设计(DBD) 广义:设计整个数据库应用系统。狭义:设计数据库本身,即各级模式并建立数据库。数据库设计的一般定义:针对给定…

Vue3钩子是什么?

钩子是 Vue.js 生命周期中的特定方法,它们在组件的不同阶段被调用。这些方法被称为“钩子”是因为它们“钩入”了 Vue.js 的生命周期,允许开发者在组件创建、更新、销毁等关键点执行自定义代码。 在 Vue.js 中,钩子方法包括: 创…

基于云架构Web端的工业MES系统:赋能制造业数字化变革

基于云架构Web端的工业MES系统:赋能制造业数字化变革 在当今数字化浪潮席卷全球的背景下,制造业作为国家经济发展的重要支柱产业,正面临着前所未有的机遇与挑战。市场需求的快速变化、客户个性化定制要求的日益提高以及全球竞争的愈发激烈,都促使制造企业必须寻求更加高效、智…

如何使用Spring Boot框架整合Redis:超详细案例教程

目录 # 为什么选择Spring Boot与Redis整合? 1. 更新 pom.xml 2. 配置application.yml 3. 创建 Redis 配置类 4. Redis 操作类 5. 创建控制器 6. 启动应用程序 7. 测试 # 为什么选择Spring Boot与Redis整合? 将Spring Boot与Redis整合可以充分利…

计算机网络(第8版)第3章课后习题--透明传输

【3-11】 试分别讨论以下各种情况在什么条件下是透明传输,在什么条件下不是透明传 输。(提示:请弄清什么是“透明传输”,然后考虑能否满足其条件。) (1)普通的电话通信。 (2)互联网提供的电子邮件服务。 解 答 : 透明传输是指在数据传输…

计算机网络--应用层--HTTP

计算机网络(第8版)谢希仁编著 P276笔记 超文本传输协议HTTP 定义了浏览器向万维网服务器请求资源的方式:(1)插入URL;(2)点击超链接 特点:(1)无…

【苏德矿高等数学】第1讲:有界函数、无界函数、复合函数

我还是喜欢高数,虽然已经是硕士在读了,但是我还是想再学一遍高数,学高数放松放松(汗流浃背了),笔记就是按视频顺序来的,随缘记录,其实我只是想用学习数学掩盖自己的一些情绪&#xf…

k8s基础(2)—Kubernetes-Namespace

一、Namespace概述 名字空间 在 Kubernetes 中,名字空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。 名字空间作用域仅针对带有…