关于NSAutoReleasePool的理解
来源:互联网 发布:amd优化软件 编辑:程序博客网 时间:2024/05/21 09:07
做iPhone应用开发已经2年多了, 但一些基础的概念性问题只是大致了解, 脑袋中有个模糊的概念. 虽然对平时工作开发没什么影响, 不过时间长了, 心里总是有点虚. 所以从现在开始, 每当我遇到一个模糊概念的问题或topic, 我都要写一篇blog来记录分析, 响应之前在网上看过的一个blog签名:好记性不如烂博客.
今天需要记录的是关于NSAutoReleasePool的理解.(大部分内容来自于iOS4.3 Library)
Cocoa的内存管理主要依赖于Reference Counting, 而NSAutoReleasePool就是用来支持它的. autorelease pool中存放的对象会在其自身干枯(drain)时被release.
我们都知道当一个object的release方法被触发时, 这个对象就被销毁了, 再也不能对它有任何引用, 否则就会出现异常. 但如果在销毁它时触发的是autorelease方法, 那这个object就进入了对应的autorelease pool, 它的生命就被延长了(当pool drain时才真正被销毁).
在Reference Counting的环境里, Cocoa总是期望在每一个thread都存在一个autorelease pool, 如果不存在, 那些被autoreleased的objects就不会被销毁, 从而产生memory leak. (印象中这种情况下xcode会在console打出warnning信息)
NSAutoReleasePool的初始化与普通的NSObject一样, 都是alloc+init, 不过pool不能被retain, 因为在drain的时候默认就销毁它自身了. 还有一点需要注意的是, 通常在销毁pool的时候用的不是它的release方法, 而是drain! 原因是为了让程序同时兼容Reference Counting内存管理环境 与 Garbge Collection环境, 因为在Garbage Colloection环境中drain的作用是触发collect garbage动作.
一般来说在应用的main thread中, 已经存在了一个autorelease pool. 有两种情况需要开发者自己新建autorelease pool:
- 在main thread中, 在某个方法中出现大量的autoreleased objects, 为了避免memory footprint的增大, 可以手动创建一些autorelease pool用来drain objects.
- 创建新的thread, 并在其中访问了Cocoa, 需要在访问的前创建autorelease pool, 访问结束后drain.
最后一点, 在每个thread中都会维持一个stack, 其中放置着所有在这个thread中创建但未销毁的pool, 每当一个新的pool创建后, 它就位于stack的最顶端, 相应autoreleased object就会放入其中. 当pool drain的时候, 它就会从stack的顶端移除, 并且release掉其包含的objects.
@end
原文:http://eleda.iteye.com/blog/1108700
- 关于NSAutoReleasePool的理解
- 关于NSAutoReleasePool的理解
- 关于NSAutoReleasePool的理解
- 关于NSAutoReleasePool的理解
- 关于NSAutoReleasePool的理解
- 关于NSAutoReleasePool的理解
- Object-关于NSAutoReleasePool的理解
- NSAutoReleasePool的理解
- NSAutoReleasePool的理解
- 今天需要记录的是关于NSAutoReleasePool的理解
- NSAutoReleasePool个人理解
- 全面深入理解NSAutoreleasePool
- iPhone中objective-c NSAutoreleasePool 的一些理解
- iPhone中objective-c NSAutoreleasePool 的一些理解
- IOS开发笔记——帮助理解NSAutoReleasePool的文章
- 关于Object-C的NSAutoreleasePool的学习
- 危险的NSAutoreleasePool
- NSAutoReleasePool的疑问
- Oracle中Union与Union All的区别
- Java字符串分割符split,StringTakenizer用法
- 大数的运算(正整型)(一) —— 大数加法
- 基础总结篇之五:BroadcastReceiver应用详解
- w 命令 和 who 命令
- 关于NSAutoReleasePool的理解
- Android RTC 自下往上浅析
- StringTokenizer:字符串分隔解析类型
- Game Server Build Record
- 软件人员推荐书目(一) 大师篇
- maven 常用命令锦集
- 大数运算 (二)—— 大数累加(正整型)
- LINUX最大线程数及最大进程数
- The New Ycnd 2D NOC SDK终于完成了!