自动释放池autoreleasepool
来源:互联网 发布:关联规则推荐算法 编辑:程序博客网 时间:2024/05/20 09:07
转载自:http://blog.csdn.net/hherima/article/details/8776538
自动释放池autoreleasepool
自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象。当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如果你给一个对象多次发送autorelease消息,那么当自动释放池销毁时,这个对象也会收到同样数目的release消息)。可以看出,一个自动释放的对象,它至少能够存活到自动释放池销毁的时候。
简单的说一个例子,返回局部堆上变量的指针(用c++的口吻说的),那么这个对象如何释放?Objective-C发明了自动释放机制。
-(obj*) foo
{
obj* temp = [[obj alloc]init];
return [ obj autorelease];//只是在返回的时候加上关键字autorelease
}
《Objective-C基础教程》上说:自动释放(autorelease)是一种延迟释放机制,这样保证局部堆上的变量能够被外部正常使用。
但是,系统又是什么时候释放的呢?在每一个事件周期(event cycle)的开始,系统会自动创建一个自动释放池;
在每一个事件周期的结尾,系统会自动销毁这个自动释放池。一般情况下,你可以理解为:当你的代码在持续运行时,自动释放池是不会被销毁的,这段时间内你也可以安全地使用自动释放的对象;当你的代码运行告一段落,开始等待用户输入(或者其它事件)时,自动释放池就会被释放掉,池中的对象都会收到一个release消息,有的可能会因此被销毁。
这是很难确定的时间,如果自动释放池的销毁时间过早,那么程序就很危险,这个恐怕很难满足程序员的要求吧。
自动释放池的缺点:它延缓了对象的释放,在有大量自动释放的对象时,会占用大量内存资源。因此,你需要避免将大量对象自动释放。并且,在以下两种情况下,你需要手动建立并手动销毁掉自动释放池:
1.当你在主线程外开启其它线程时:系统只会在主线程中自动生成并销毁掉自动释放池。
2.当你在短时间内制造了大量自动释放对象时:及时地销毁有助于有效利用iPad上有限地内存资源。
- 自动释放池autoreleasepool
- 自动释放池 (autoReleasePool)
- 自动释放池autoreleasepool
- @autoreleasePool 自动释放池
- ios自动释放池(autoreleasepool)
- ios自动释放池相关,autoreleasepool;
- 刀哥多线程自动释放池autoreleasepool
- Objective-C自动释放池AutoreleasePool详解
- Autoreleasepool自动释放池与内存相关
- @autoreleasepool 创建自动释放连接池(内存管理)
- 自动释放池的前世今生 ---- 深入解析 autoreleasepool
- 关于@autoreleasepool的性能测试及手动释放自动释放池
- 关于@autoreleasepool的性能测试及手动释放自动释放池
- [Objective-C] 自动释放池(Autoreleasepool)--拆迁队的外援
- Objective-C的自动释放池(autoreleasepool)、静态方法快速创建对象
- Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- 《Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)》读后感
- Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- Facts vs. Dimensions-----Understanding Key Business Intelligence Terms
- WolframAlpha
- java NIO(转)
- 常见算法笔试或面试题
- 快速排序法(一)
- 自动释放池autoreleasepool
- Javascript全局变量var与不var的区别深入解析
- pushlet实现服务器推送
- Action<T>泛型委托
- Http异常eurl.axd出错信息解决方法
- Qt工作历程-引言
- 关于MX3在XP系统下正常使用磁盘功能的小窍门
- 如何在多台机器上共享IOS证书
- Windows 8 Metro app开发初体验