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的关系
相关推荐
dy171722 分钟前
element-plus表格默认展开有子的数据
前端·javascript·vue.js
2501_915918414 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
程序员的世界你不懂5 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技5 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip5 小时前
JavaScript二叉树相关概念
前端
attitude.x6 小时前
PyTorch 动态图的灵活性与实用技巧
前端·人工智能·深度学习
β添砖java6 小时前
CSS3核心技术
前端·css·css3
空山新雨(大队长)6 小时前
HTML第八课:HTML4和HTML5的区别
前端·html·html5
猫头虎-前端技术6 小时前
浏览器兼容性问题全解:CSS 前缀、Grid/Flex 布局兼容方案与跨浏览器调试技巧
前端·css·node.js·bootstrap·ecmascript·css3·媒体