`
eleda
  • 浏览: 28615 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于NSAutoReleasePool的理解

阅读更多

做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:

  1. 在main thread中, 在某个方法中出现大量的autoreleased objects, 为了避免memory footprint的增大, 可以手动创建一些autorelease pool用来drain objects.
  2. 创建新的thread, 并在其中访问了Cocoa, 需要在访问的前创建autorelease pool, 访问结束后drain.

最后一点, 在每个thread中都会维持一个stack, 其中放置着所有在这个thread中创建但未销毁的pool, 每当一个新的pool创建后, 它就位于stack的最顶端,  相应autoreleased object就会放入其中. 当pool drain的时候, 它就会从stack的顶端移除, 并且release掉其包含的objects.

 

@end

分享到:
评论
4 楼 Gorson11 2014-11-23  
这里有更详细的:http://tieba.baidu.com/p/3427605546
3 楼 jimode2013 2013-05-27  
当一个object的release方法被触发时, 这个对象就被销毁了, 再也不能对它有任何引用, 否则就会出现异常 不是这样说的吧?是计数器减1,销毁的条件是计数器等于0
2 楼 txlong_onz 2012-09-13  
作为初学者,真心木看懂。
1 楼 xueyi_lee 2012-02-17  
不错,算是懂了一些了。。。

相关推荐

    有时侯我们需要延迟一个对象的引用计算减一操作

    在iOS开发中,内存管理是至关重要的,特别是对于Objective-C编程,其中的对象使用引用计数进行内存管理。在本文中,我们将深入探讨一种特定的内存管理...理解并正确使用这些概念对于编写高效、稳定的iOS应用至关重要。

    详细讲述在采用引用计数的内存回收方式的工作原理[定义].pdf

    引用计数是一种常见的...总之,引用计数、`alloc`、`release`、`retain`、`autorelease`以及`NSAutoreleasePool`是Objective-C内存管理的关键组成部分,理解并正确使用这些概念对于避免内存泄漏和程序崩溃至关重要。

    2015年上半年的iOS面试及笔试集锦

    在这个领域的深入理解和实践能力是iOS开发者必备的技能之一。下面将对这个主题进行详尽的阐述。 首先,我们要理解iOS中的内存管理基本原理。在iOS中,主要采用两种内存管理策略:引用计数(Reference Counting)和...

    iphone 相关文档

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // insert code here... NSLog(@"你好,世界!"); [pool drain]; return 0; } ``` 恭喜,你已经创建了你的第一个Objective-C程序,它会打印出...

    object-C内存管理

    本练习主要关注如何有效地使用和理解这个机制,以及ARC(Automatic Reference Counting)的引入,它是Objective-C 2.0中的一个重要改进。 1. 引用计数: 在Objective-C中,每个对象都有一个引用计数,表示指向该...

    ios面试总结

    iOS面试总结主要涵盖了C语言基础和Objective-C的相关知识点,以下...理解并熟练掌握这些概念对于iOS开发者来说至关重要。在面试中,能够深入地讨论这些话题,不仅展示了扎实的技术基础,也体现了问题解决和调试的能力。

    Objective-C的另类教程

    NSAutoreleasePool *releasePool = [[NSAutoreleasePool alloc] init]; // 执行你的任务... [releasePool drain]; } ``` NSOperation和NSInvocationOperation是更高级的多线程工具,它们提供了更好的任务管理和...

    小议iOS内存管理-中文.pdf

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; ``` 在程序执行过程中,Xcode通常会在`main`函数中自动创建一个自动释放池。该池在运行结束时会自动销毁所有`autorelease`对象,但仅调用`release`...

    Objective-C 编程之道 iOS设计模式解析 修改MRC为ARC

    2. 检查并处理未被ARC支持的代码,如`NSAutoReleasePool`、`retainCount`等。 3. 更新任何自定义的内存管理规则,确保与ARC兼容。 4. 验证和测试整个项目,确保没有内存泄漏或其他问题。 TouchPainter这个文件可能...

    关于block的循环引用

    - 使用NSStackBlock和NSAutoreleasePool:将Block复制到堆上,并配合使用`@autoreleasepool`,可以避免Block与对象间的强引用关系。 5. ARC(Automatic Reference Counting)与循环引用: 尽管ARC能自动管理大...

    Objective-C培训资料

    ### Objective-C培训资料知识点概述 #### 一、程序整体语法结构 Objective-C 是一种面向对象的编程语言,它是对标准 C 语言的扩展,增加了面向对象功能和动态...理解这些基础知识对于深入学习 Objective-C 至关重要。

    ios类库以及foundation框架

    标题“iOS类库以及Foundation框架”所涉及的知识点主要集中在iOS开发领域内,特别是关于Foundation框架的讲解。Foundation是iOS开发者必须熟悉的基础框架之一,它提供了一组标准的APIs,用于管理数据、执行基本任务...

    OC中的内存管理

    此外,OC还提供了一些其他工具和策略来优化内存管理,例如`NSAutoreleasePool`,它允许在特定范围内自动释放不再使用的对象,这对于临时对象的管理非常有用,特别是在多线程环境中。还有`NSZone`,它提供了一种内存...

    object-c内存管理与实例

    然而,理解这些概念仍然很重要,因为有些情况下仍需要手动管理内存,比如使用`NSAutoReleasePool`或与Cocoa Touch框架交互。 接下来,我们讨论一些关键概念: - `nil`赋值:将对象赋值为`nil`会立即将其引用计数...

    Block循环引用的问题

    4. 使用NSStackBlock和NSAutoreleasePool:对于那些生命周期短暂的Block,可以在Block内部创建一个NSAutoreleasePool,然后将Block从栈复制到池中,当池被释放时,Block也会随之释放,从而避免循环引用。 在实践中...

    iPhone Mac Objective-C内存管理教程和原理剖析

    //...} // obj1 会被自动释放,因为它是自动释放池内的对象```了解了这些基本概念后,你就能更好地理解 Objective-C 的内存管理机制,避免内存泄漏和意外崩溃。实践中,掌握好这些原则并结合 Xcode 的内存分析工具...

    IOS面试题 OC语言基础测试及答案

    理解引用计数规则、strong、weak、unowned引用的区别以及NSAutoReleasePool的使用是面试的关键。 10. **KVC(Key-Value Coding)和KVO(Key-Value Observing)** KVC是一种间接访问对象属性的方式,通过键值路径...

    block的循环引用导致的内存泄露的示例及解决办法

    3. 使用NSStackBlock和NSAutoReleasePool:在某些情况下,可以将Block转换为栈上的Block,然后在池中释放。但这需要对内存管理有深入理解,且可能导致其他问题,一般不推荐。 五、其他注意事项 - 尽量避免在Block...

    Foundation_Framework_Reference

    文档中的“Tasks”、“ClassMethods”和“InstanceMethods”为开发者提供了关于如何使用NSAutoreleasePool类的详细信息。 4. **NSBlockOperation**:块操作类,属于Grand Central Dispatch(GCD)的一部分,用于...

Global site tag (gtag.js) - Google Analytics