12.06-自动释放池(autoreleasepool)
文章目录
- 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
- 第一个observer :
- 监听了KCFRunLoopEntry时间,会调用objc_autoreleasePoolPush()
- 第二个observer :
- 监听了KCFRunLoopBeforeWaiting事件,会调用objc_autoreleasePoolPop(),objc_autoreleasePoolPush()
- 监听了KCFRunLoopBeforeExit事件,会调用objc_autoreleasePoolPop()
这样push 和 pop 就会形成一个闭环,确保成对出现.
12.06-自动释放池(autoreleasepool)相关推荐
- iOS之深入解析自动释放池autoreleasepool的底层原理
一.自动释放池 autoreleasepool 原理 自动释放池是 OC 中的一种内存自动回收机制,它可以将加入 autoreleasePool 中的变量 release 的时机延迟. 简单来说,就是 ...
- [Objective-C] 自动释放池(Autoreleasepool)--拆迁队的外援
C#妹妹:内存的清理跟生活中的拆迁一样是个麻烦事情啊 Objective-C阿姨:是啊,该拆的不拆,占用空间,不该拆的拆了,程序崩溃 C#妹妹:说白了,难度不在拆上,在判定上,判断到底那些内存是用不上 ...
- 自动释放池autoreleasepool
自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象.当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如 ...
- 《C#妹妹和Objective-C阿姨对话录》(05)自动释放池--拆迁队的外援
C#妹妹:内存的清理跟生活中的拆迁一样是个麻烦事情啊 Objective-C阿姨:是啊,该拆的不拆,占用空间,不该拆的拆了,程序崩溃 C#妹妹:说白了,难度不在拆上,在判定上,判断到底那些内存是用不上 ...
- ios中的自动释放池
自动释放池中是否有虑重功能 1 @autoreleasepool { 2 UIView *view = [UIView alloc] init] autorelease]; 3 [view autor ...
- Objective-c自学笔记(5)-自动释放池
解决的问题 每一个东西的产生都是在实际生活迫切需要这样的东西后,人们通过思考发明创造某些东西用以解决这个问题.那么自动释放池用来解决什么问题?请看下面的例子: 对于一些有返回值的消息(方法),它返回的 ...
- iOS 多线程 自动释放池常见面试题代码
同步:代码依次执行,一个人执行多个任务,也是依次执行.一个人在同一时间只执行一个任务 异步:可以同时执行多个任务 进程:指在系统中运行的应用程序,每个进程都是独立的,都有独立的且安全的运行空间 线程: ...
- 第六讲:Obj-C 内存管理4 - 自动释放池
转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/ 第六讲:Obj-C 内存管理4 - 自动释放池 主要 ...
- iOS内存管理 —— 自动释放池和runloop
iOS内存管理 -- 自动释放池和runloop 1. 自动释放池 1.1 自动释放池介绍 1.2 自动释放池底层原理 objc_autoreleasePoolPush autoreleaseNoPa ...
最新文章
- 五子棋c语言策划书活动内容,五子棋比赛策划书
- c# socket接收字符串_Python高级编程之 Socket 编程
- 简单记线程安全的集合类
- 用递归调用法求斐波那契函数_进阶版:面试官问你斐波那契数列的时候不要高兴得太早...
- 【kali】kali环境下安装dvwa
- IDFT的python实现
- 来博客园居然有一年了
- OceanBase之oracle租户的使用体验
- python中闭包的作用_Python闭包及其作用域
- eclipse查看一个方法被谁引用(调用)的快捷键四种方式
- - 动规讲解基础讲解一——01背包(模板)
- 偏微分方程数值解的matlab程序,偏微分方程数值解法MATLAB源码
- 按键精灵手机助手连接mumu模拟器的方法,适用于任何模拟器连接按键精灵手机助手
- 实体连锁电商会员运营方案
- hashcat详细使用教程
- Javaweb制定的订餐系统+jsp+servlet+Java+MySQL
- 阿里云cdn以及阿里云负载均衡配置方法
- 卫星遥感—地块/边界提取相关论文
- macOS更新失败解决
- (十八)树莓派3B+ wiringPi库的使用--外部中断