NSAutoReleasePool 用法

NSAutoReleasePool 用法,第1张

概述好记性不如烂博客. 今天需要记录的是关于NSAutoReleasePool的理解.(大部分内容来自于iOS4.3 Library)   Cocoa的内存管理主要依赖于Reference Counting, 而NSAutoReleasePool就是用来支持它的. autorelease pool中存放的对象会在其自身干枯(drain)时被release.   我们都知道当一个object的relea

好记性不如烂博客.

今天需要记录的是关于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

总结

以上是内存溢出为你收集整理的NSAutoReleasePool 用法全部内容,希望文章能够帮你解决NSAutoReleasePool 用法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1059172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存