autorelease pool

  1. 有两个observer会监听runloop两个事件,一个observer监听runloop要进入的是时候entry,会调用pool push方法创建一个autorelease pool

  2. 另一个observer监听runloop的状态,当runloop要进入休眠状态时beforewaiting,会pop一个自动释放池,同时push创建一个新的自动释放池。

  3. AutoreleasePoolPage 结构

    arduino 复制代码
    class AutoreleasePoolPage
    {
    const magic
    id *next 指向下一个可以存放被释放对象的地址
    pthread_t const thread 当前所在的线程
    AutoreleasePoolPage *const parent 当前page的父节点
    AutoreleasePoolPage *child
    
    
    }
  4. 每个page占4096个字节也就是4kb,自身成员变量只占56个字节,也就是7个成员变量,每个成员变量占8个字节。其他四千多个字节都是用来存放被autorelease修饰的对象内存地址。

  5. pool_boundary的作用是区分不同自动释放,调用push时,会传入一个pool_boundary并返回一个地址,这个地址不存储@autorelease对象的地址,起到一个标识作用,用来分隔不同的autoreleasepool

  6. 调用pop的时候,会传入end地址,从后到前调用对象的release方法,直到pool_boundary为止。

  7. 如果存在多个page,会从child的page最末尾开始调用,直到pool_boundary

  8. page是一个栈结构,释放是从栈顶开始

  9. 多层嵌套会共用一个page,通过pool_boundary来分隔,优先释放在里层的pool,因为最里层的pool中的对象被放倒了栈顶,优先释放栈顶对象。

    swift 复制代码
    @autoreleasepool {
         NSObject *p1 = [[NSObject alloc] init]
         NSObject *p2 = [[NSObject alloc] init]
              @autoreleasepool {
                     NSObject *p3 = [[NSObject alloc] init]
                            @autoreleasepool{
                                   NSObject *p4 = [[NSObject alloc] init]
    }
    }
    }
  1. 释放时机:如果通过代码添加一个autoreleasepool,在作用域结束时,随着pool的释放,就会释放pool中的对象,这种情况是几十释放的,并不依赖于runloop。另一个就是系统自动释放的,系统会在runloop开始的时候创建一个pool,结束的时候会对pool中对象执行release操作。
  2. autoreleasepool 和 runloop的关系
相关推荐
网安蟹佬霸2 分钟前
WebAssembly安全攻防实战:从WASM逆向到漏洞利用
前端·安全·自动化·区块链·智能合约·wasm
Su米苏21 分钟前
关于@vue-office/excel 渲染异常滚动失去内容
前端·vue.js·excel
灯澜忆梦22 分钟前
【基于GO的Web开发10】gin获取HTML-Form表单提交参数
前端·后端·golang·html·gin
撑伞的鱼99371 小时前
2026年前端AI编程工具评测:Figma 还原、组件复用、跨文件联动三项对比
前端·ai编程·figma·效率工具·ai编程工具
码视野1 小时前
基于 Vue3 + Element Plus 的【微短剧剧本智能创作与分镜生产协同系统】设计与实现(含PRD/三端源码/大屏)
前端·人工智能·vue3
zzzzzz3101 小时前
36K stars 的“酷炫组件”,到底该怎么用才不显得用力过猛?
前端·react.js·动效
2401_894915534 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
Profile排查笔记10 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
lzhdim10 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
denggun1234510 小时前
yield
前端·数据库·python