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