文章目录

    • 1. 自动释放池
    • 2. AutoreleasePoolPage的结构
    • 3. 源码
      • 1. push()
      • 2. autorelease
      • 3. pop()
    • 4. Runloop & autoreleasepool

1. 自动释放池

查看CPP代码

自动释放池 ,
进入大括号的时候,创建一个obj;
然后括号里面创建的对象都会被自动添加autorelease(ARC),被push到池中;
在出了大括号后,把自动释放池内添加的对象进行释放


  • 自动释放池主要的底层数据结构是

__AtutoreleasePool , AutoreleasePoolPage


2. AutoreleasePoolPage的结构

  • next : 执行下一个存储位(下一个能放autorelease对象地址的区域)

next = begin 说明page是空的
next = end 说明page是 满的(fullpage)

  • 调用push方法会将一个POOL_BOUNDARY入栈,并返回其存放的内存地址

  • hotPage

当前正在使用的page

  • coldPage

不被使用的page,一般是因为已经被装满了.
一个page会有一定的空间(4096-56)来装入对象,当page的空间还没有 满,还可以被装入对象时,这个page就是hotPage;表明再有对象要被装入,就会装到这个Page中,
如果这个page被装满了,next会=end,同时创建一个新的poolPage2,page的child指向这个新的poolPage2. page会变成coldpage,新的poolPage2成为hotPage.
以后再有什么操作,都会从这个hotpage开始.比如pop,addObj,push


3. 源码

1. push()

  • 这里的push 只是大括号开始时push,会向里面入栈一个POOL_BOUNDARY
  • add(obj)也相当于入栈POOL_BOUNDARY

obj 指向的地址也就是POOL_BOUNDARY的地址
POOL_BOUNDARY : 自动释放池的边界


2. autorelease

  • 往pool中添加对象 , ARC下 自动释放池找那个创建的对象会被自动添加autorelease



3. pop()


从hotPage , --page->next 来获取对象,然后release


4. Runloop & autoreleasepool

  • iOS在主线程的runloop中注册了两个observer
  1. 第一个observer :
  • 监听了KCFRunLoopEntry时间,会调用objc_autoreleasePoolPush()
  1. 第二个observer :
  • 监听了KCFRunLoopBeforeWaiting事件,会调用objc_autoreleasePoolPop(),objc_autoreleasePoolPush()
  • 监听了KCFRunLoopBeforeExit事件,会调用objc_autoreleasePoolPop()

这样push 和 pop 就会形成一个闭环,确保成对出现.

12.06-自动释放池(autoreleasepool)相关推荐

  1. iOS之深入解析自动释放池autoreleasepool的底层原理

    一.自动释放池 autoreleasepool 原理 自动释放池是 OC 中的一种内存自动回收机制,它可以将加入 autoreleasePool 中的变量 release 的时机延迟. 简单来说,就是 ...

  2. [Objective-C] 自动释放池(Autoreleasepool)--拆迁队的外援

    C#妹妹:内存的清理跟生活中的拆迁一样是个麻烦事情啊 Objective-C阿姨:是啊,该拆的不拆,占用空间,不该拆的拆了,程序崩溃 C#妹妹:说白了,难度不在拆上,在判定上,判断到底那些内存是用不上 ...

  3. 自动释放池autoreleasepool

    自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...

  4. 《C#妹妹和Objective-C阿姨对话录》(05)自动释放池--拆迁队的外援

    C#妹妹:内存的清理跟生活中的拆迁一样是个麻烦事情啊 Objective-C阿姨:是啊,该拆的不拆,占用空间,不该拆的拆了,程序崩溃 C#妹妹:说白了,难度不在拆上,在判定上,判断到底那些内存是用不上 ...

  5. ios中的自动释放池

    自动释放池中是否有虑重功能 1 @autoreleasepool { 2 UIView *view = [UIView alloc] init] autorelease]; 3 [view autor ...

  6. Objective-c自学笔记(5)-自动释放池

    解决的问题 每一个东西的产生都是在实际生活迫切需要这样的东西后,人们通过思考发明创造某些东西用以解决这个问题.那么自动释放池用来解决什么问题?请看下面的例子: 对于一些有返回值的消息(方法),它返回的 ...

  7. iOS 多线程 自动释放池常见面试题代码

    同步:代码依次执行,一个人执行多个任务,也是依次执行.一个人在同一时间只执行一个任务 异步:可以同时执行多个任务 进程:指在系统中运行的应用程序,每个进程都是独立的,都有独立的且安全的运行空间 线程: ...

  8. 第六讲:Obj-C 内存管理4 - 自动释放池

    转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/ 第六讲:Obj-C 内存管理4 - 自动释放池 主要 ...

  9. iOS内存管理 —— 自动释放池和runloop

    iOS内存管理 -- 自动释放池和runloop 1. 自动释放池 1.1 自动释放池介绍 1.2 自动释放池底层原理 objc_autoreleasePoolPush autoreleaseNoPa ...

最新文章

  1. [angularjs] angularjs系列笔记(四)控制器
  2. [验证码识别技术]-初级的滑动式验证图片识别
  3. Facebook 宣布开源无线设备 打造全新5G世界
  4. [转] Boost智能指针——scoped_ptr
  5. winrar压缩工具
  6. pywin32 获取窗口句柄_Excel VBA | 这个窗口居然关不掉
  7. go中的读写锁RWMutex
  8. 【AAAI 2020】微软亚洲研究院6篇精选论文在家必看!
  9. 排便的快感--不是非主流
  10. 孙鑫VC学习笔记:第十一讲 (四) 图形重绘方法三 利用兼容DC
  11. SpringBoot整合高德地图 地理编码\逆地理编码
  12. 3dmax 计算机中丢失,3dmax材质丢失怎么快速找回-解决3dmax材质不见了的方法 - 河东软件园...
  13. InstallShield 取消特定安装步骤
  14. 卡方检验以及P值的计算
  15. html 插件 firefox,firefox插件 怎么在firefox里添加插件
  16. 机器学习(三):一文读懂线性判别分析(LDA)
  17. python + pyqt5 自制exe 随机换壁纸
  18. 数据库的应用之(智慧城市)
  19. 如何找回u盘被删除的文件
  20. 天创速盈:拼多多低价引流怎么玩?大部分中小卖家都不知道

热门文章

  1. XHR请求与fetch请求
  2. Oculus Quest 2 和 Unity 的 VR 开发基础知识
  3. vue+vant2—篇3—定制主题色
  4. 东大《实用写作》在线平时作业123
  5. css盒子模型及其实战案例(上)
  6. ​青理工大work总结知识点 1
  7. iOS内置地图导航开发指南
  8. mysql添加字段指定顺序_mysql 添加字段、删除字段、调整字段顺序
  9. D. Backspace
  10. TextView文本大小自动适配与TextView边距的去除