文章目录

    • 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. 五子棋c语言策划书活动内容,五子棋比赛策划书
  2. c# socket接收字符串_Python高级编程之 Socket 编程
  3. 简单记线程安全的集合类
  4. 用递归调用法求斐波那契函数_进阶版:面试官问你斐波那契数列的时候不要高兴得太早...
  5. 【kali】kali环境下安装dvwa
  6. IDFT的python实现
  7. 来博客园居然有一年了
  8. OceanBase之oracle租户的使用体验
  9. python中闭包的作用_Python闭包及其作用域
  10. eclipse查看一个方法被谁引用(调用)的快捷键四种方式
  11. - 动规讲解基础讲解一——01背包(模板)
  12. 偏微分方程数值解的matlab程序,偏微分方程数值解法MATLAB源码
  13. 按键精灵手机助手连接mumu模拟器的方法,适用于任何模拟器连接按键精灵手机助手
  14. 实体连锁电商会员运营方案
  15. hashcat详细使用教程
  16. Javaweb制定的订餐系统+jsp+servlet+Java+MySQL
  17. 阿里云cdn以及阿里云负载均衡配置方法
  18. 卫星遥感—地块/边界提取相关论文
  19. macOS更新失败解决
  20. (十八)树莓派3B+ wiringPi库的使用--外部中断

热门文章

  1. 电脑触摸板无法使用,I2C HID设备异常处理。
  2. 一文了解,前端网页布局常用的几种方式
  3. 如何简单快速复制网页上的文字?
  4. JavaScript 案例之 楼梯滚动特效(jQuery实现)
  5. 苹果CarPlay,从“小甜甜”变成了“牛夫人”
  6. echarts实现象形图记录一下
  7. Endnote卸载不了的问题
  8. html+css+js实现一个简单的电商商城首页
  9. 基于qt4的串口调试助手开发
  10. 小和尚学习-数组常用API