关于NSAutoRealeasePool的理解
来源:互联网 发布:缩小照片大小软件 编辑:程序博客网 时间:2024/04/29 15:41
转自:http://eleda.iteye.com/blog/1108700
做iPhone应用开发已经2年多了,淡一些接触的概念性的问题只是大致了解,脑袋中有个模糊的概念。虽然对平时工作开发没什么影响,不过时间长了,心里总是有点虚。所以从现在开始,每当我遇到一个模糊概念的问题或topic,我都要写一篇blog来记录分析,响应之前在网上看过的一个blog签名:好记性不如烂博客。
今天需要记录的是关于NSAutoReleasePool的理解。(大部分内容来自于iOS4.3 Library)
Cocoa的内存瓜林主要依赖于Reference Counting,而NSAutoReleasePool就是用来支持它的。autorelease poot中存放的对象会在其自身干枯(drain)时被release。
我们都知道当一个object的release方法被触发时,这个对象就被销毁了,再也不能对它有任何引用,否则就会出现异常。但如果在销毁它时触发的是autoreelase方法,那这个object就进入了对应的autorelease pool,它的声明就被延长了(当pool drain时才真正被销毁)。
在reference counting的环境里,Cocoa总是期望在每一个thread都存在一个autorelease pool,如果不存在,那些被autorelease的object就不会被销毁,从而产生memory leak。(印象中这种情况下xcode会在console打出warning信息)
NSAutoReleasePool的初始化与普通的NSObject一样,都是alloc+init,不过pool不能被retain,因为在drain的时候默认就销毁它自身了。还有一点需要注意的是,通常在销毁pool的时候用的不是它的release方法,而是drain!原因是为了让程序同时兼容reference counting内存管理环境与garbage collection环境,因为在garbage colleciton环境中drain的作用是触发collect garbage动作。
一般来说在应用个main thread中,已经存在了一个autorelease pool。有两种情况需要开发者自己新建autorelease pool:
1. 在main thread中,已经存在了一个autoreleased object,为了避免memory footprint的增大,可以手动创建一些autorelease pool用来drain objects。
2. 创建新的thread,并在其中访问了Cocoa,需要在访问前创建autorelease pool,访问后drain。
最后一点,在每个thread中都会维持一个stack,其中纺织着所有这个thread中创建但未销毁的pool,每当一个新的pool创建后,它就位于stack的最顶端,相应autorlease object就会放入其中。当pool drain的时候,它就会从stack的顶端移除,并且release掉其包含的objects。
@end
谢谢观赏。
- 关于NSAutoRealeasePool的理解
- 关于scn的理解
- 关于com的理解
- 关于SCN的理解
- 关于class 的理解
- 关于中断的理解
- 关于权限的理解
- 关于scn的理解
- 关于人机交互的理解
- 关于MVC的理解
- 关于Ispostback的理解
- 关于委托的理解
- 关于Load的理解
- 关于MVC的理解
- 关于socket的理解
- 关于getchar的理解
- 关于初始化的理解
- 关于GRUB的理解
- Java实现通过递归遍历树形结构
- 关于ubuntu grub的吐槽
- iOS开发18-iOS 诸葛亮的锦囊妙计--Block的使用
- [leetcode 9] Palindrome Number
- Linux开发调试经验整理(二)——信号处理函数陷阱:调用malloc导致死锁
- 关于NSAutoRealeasePool的理解
- Hadoop之HDFS的API实现
- 使用Matlab中regionprops函数获取图像连通区域
- 【随机过程】马尔可夫链(1)
- Git学习(二) 常用命令详解
- MenuItem的setAsAction四种属性解析
- demo1
- 多线程与网络A
- 页面ajax提交,控制器php处理