首页 > 其他分享 >iOS:AutoReleasePool

iOS:AutoReleasePool

时间:2023-04-21 13:44:20浏览次数:35  
标签:字节 对象 iOS AutoreleasePoolPage objc AutoreleasePool AutoReleasePool page

具体参考文章

  1. AutoRelease 是依靠 AutoreleasePoolPage 来进行 push 和 pop 进行工作的
  2. AutoreleasePoolPage 为双向链表,parent 字段指向上一层,child 指向下一层
  3. 每个 AutoreleasePoolPage 的大小为 4096 字节
  4. 每个 AutoreleasePoolPage 最多可以存放 505 个对象。首个 page 可以存储 504 个对象要创建一个哨兵对象。
  5. AutoreleasePool 和 线程是一一对应的。
  6. hotpage: 是指当前正在使用的 page

Q. 为什么 AutoreleasePoolPage 最多存放 505 个对象。

AutoreleasePoolPageData 结构体占了 56 个字节。其中

* magic:16 字节。(为一个结构体,用来验证 AutoreleasePoolPage 完整性)
* next :8 字节。(添加时,记录Autorelease 对象的下一个位置)
* parent:8 字节。(记录上一个page)
* child:8 字节。(记录下一个 page)
* thread:8 字节。(当前 AutoreleasePool 所在的线程,AutoreleasePool和线程对应)
* depth:4 字节。(记录节点深度)
* hiwat:4 字节。

剩余容量:4096-16-48-24 = 4040
最大存储对象数量:4040/8 = 505
当 page 为首个的时候,需要创建一个 pool 哨兵对象,占 8 字节。所以为 504 个

Q. AutoreleasePool 和 Runloop 的关系

再 app 启动后 Runloop 会注册很多 observers,其中就有和 AutoreleasePool 相关的。

  • 即将进入 Runloop 时,进行调用_objc_autoreleasePoolPush创建AutoreleasePool
  • runloop 即将睡眠时,执行_objc_autoreleasePoolPop来释放旧的释放池,同时_objc_autoreleasePoolPush创建一个新的,用来添加唤醒后需要处理的
  • runloop 即将退出时,执行_objc_autoreleasePoolPop来释放

标签:字节,对象,iOS,AutoreleasePoolPage,objc,AutoreleasePool,AutoReleasePool,page
From: https://www.cnblogs.com/dulinshun/p/iosautoreleasepool.html

相关文章

  • iOS:runloop 相关
    一个Runloop包含了多个mode一个mode包含了若干个source0/source1/time/observerRunloop启动时只能选择其中一个model作为当前modelRunloop常用的Model1.UIInitializationRunLoopMode:首次启动时执行的mode,启动后不再使用2.kRunloopDefaultMode:默认mode,一般主......
  • BIOS
    配置开发环境,写一个helloworld驱动程序编写基本的驱动程序代码结构,导出为自定义项目模板,方便以后使用模板创建项目,少写一些样板代码;同时了解了wdk的ntifs头文件和预处理指令#pragmaonce  vscode联机搜索文档 开发三件套: 调试器WinDbg(X64)+虚拟机VirtualBox+编译器VSc......
  • iOS:Cocoapods 常用命令
    命令描述安装与卸载sudogeminstallcocoapods安装cocoapodssudogeminstallcocoapods-v1.10.0安装cocoapods1.10.0版本sudogemuninstallcocoapods卸载cocoapodssudogemuninstallcocoapods-v1.10.0卸载版本1.10.0---安装在个......
  • vue全家桶进阶之路47:Vue3 Axios拦截器封装成request文件
    可以将Axios拦截器封装成一个单独的request文件,以便在整个应用程序中重复使用。以下是一个示例,展示如何将Axios拦截器封装成一个request文件:1、创建一个名为request.js的新文件,并导入Axios:importaxiosfrom'axios';2、创建一个名为request的函数,并将其导出:这将创建一个名......
  • vue全家桶进阶之路46:Vue3 Axios拦截器和globalProperties全局设置
    在Vue.js3中,使用Axios与Vue.js2.x中类似,但是需要进行一些修改和更新,下面是Vue.js3中Axios的定义和使用方式:首先,你需要安装Axios和Vue.js3.x,可以使用npm或yarn等包管理工具安装:npminstallaxiosvue@next然后,在你的Vue.js3应用程序中,你可以使用以下代码来导入和使用Axio......
  • Module not found: Error: Can't resolve 'axios' in 'D:\BaiduSyncdisk\vue-cli-pr
    Modulenotfound:Error:Can'tresolve'axios'in'D:\BaiduSyncdisk\vue-cli-project\dc_vue3\src\utils'  因:没有安装axios插件在运行项目的地方npminstall--saveaxios解决办法 npminstall--saveaxios......
  • 基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux
    2023年目前要说最热的点,肯定是ChatGPT了。ChatGPT官方提供的网页版本,还有需要科*上网,很多人都会基于此进行封装。现在是移动互联网时代,基于手机APP的需求还是很大的。所以,今天给大家推荐一个ChatGPT客户端开源项目,兼容苹果和安卓手机、PC。项目简介这是基于C#开发的客户端,兼......
  • MASA MAUI Plugin IOS蓝牙低功耗(三)蓝牙扫描
    MASAMAUIPluginIOS蓝牙低功耗(三)蓝牙扫描项目背景MAUI的出现,赋予了广大Net开发者开发多平台应用的能力,MAUI是Xamarin.Forms演变而来,但是相比Xamarin性能更好,可扩展性更强,结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项目,意在对微软MAUI的......
  • MASA MAUI Plugin (十)iOS消息推送(原生APNS方式)
    MASAMAUIPlugin(十)iOS消息推送(原生APNS方式)背景MAUI的出现,赋予了广大Net开发者开发多平台应用的能力,MAUI是Xamarin.Forms演变而来,但是相比Xamarin性能更好,可扩展性更强,结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项目,意在对微软MAUI的补......
  • MASA MAUI Plugin (七)应用通知角标Android+iOS
    MASAMAUIPlugin(七)应用通知角标(小红点)Android+iOS背景MAUI的出现,赋予了广大Net开发者开发多平台应用的能力,MAUI是Xamarin.Forms演变而来,但是相比Xamarin性能更好,可扩展性更强,结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项目,意在对微软MAU......