oc-内存管理之自动释放--我自动释放了我使用的所有对象,但程序占用内存还是偏高,为什么?
来源:互联网 发布:mac能用移动硬盘吗 编辑:程序博客网 时间:2024/04/28 01:33
摘自:OC基础教程如下:
有时,自动释放池未能按照通常预期的情况进行清理。于是就有了问题“虽然我已经自动释放了我所使用的所有对象,但是我的程序占用的内存一直保持绝对的增长。”,下面的代码通常会引起这样的问题:
//h文件
@interface opp: NSObject{
}
-(NSString*) description;
@end
//
//CPP文件
@implementation opp
-(NSString*) description
{
NSString* descriptinon;
descriptinon =[ [NSString alloc] initwithFormat:@"i am%d",25];
return ([descriptinon autorelease]);
}
@end
//
NSMuatableArray* someArray;
int j=0;
while(j < 1000000)
{
[someArray addObject:[[opp alloc] init]];
}
int i;
for( i = 0; i < 1000000; i++)
{
id object = [someArray objectAtIndex:i];
NSString* desc = [object description];
//and do something with the description
}
该程序执行一个循环,在大量的迭代中每次都会生成一个(或2个、10个)自动释放的对象。请记住,自动释放池的销毁时间是完全确定的,它在循环执行过程中不会被销毁。这个循环创建了100万个description字符串对象,所有这些对象都被放进当前的自动释放池中,因此就产生了100万个闲置的字符串,这100万个字符串对象一直存在,只有当自动释放池被销毁时才最终获得释放。
解决这类问题的方法是在循环中创建自己的自动释放池,这样一来,循环没执行设定的次数就销毁当前的自动释放池并创建一个新的自动释放池。如下:
NSAutoreleasePool* pool;
int i;
for( i = 0; i < 1000000; i++)
{
id object = [someArray objectAtIndex:i];
NSString* desc = [object description];
if(i == 1000)
{
[pool release];
pool = [[ NSAutoreleasePool alloc] init ];
}
//and do something with the description
}
[pool release];
这样的话就解决了内存持续占用过高的问题,自动释放池的分配和销毁操作代价很小,因此你甚至可以在循环的每次迭代中创建一个新的自动释放池。自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶。接受autorelease消息的对象将被放入最顶端的自动释放池中,如果将一个对象放入一个自动释放池中,然后创建一个新的自动释放池再销毁该新创建的自动释放池,虽然这样,但在新创建之前的那个自动释放池是仍未销毁的,当然包括其中的对象也还存在。
- oc-内存管理之自动释放--我自动释放了我使用的所有对象,但程序占用内存还是偏高,为什么?
- OC--内存管理之自动释放,[NSMutableArray array]生成的自动释放数组被自动释放后引起的严重后果
- OC-028.ARC自动内存管理的自动释放池
- oc内存管理 ---自动释放池
- OC内存管理之—自动释放池
- OC手动内存管理-使用自动释放池
- OC-内存-自动释放池
- iOS内存管理之自动释放池延迟销毁对象
- 内存管理之自动释放池
- C++中单例对象的内存自动释放
- autorelease pool的内存管理之-自动释放池
- 6、内存管理(自动释放池)-OC
- OC-027.手动内存管理中的自动释放池@autorelease
- 使用auto_ptr自动释放内存
- OC手动内存管理-临时对象与事件循环中的自动释放池
- OC视频笔记(数组的内存管理)(OC自动释放池)
- 自动释放内存的指针
- NSMutableArray中的自动释放对象让我郁闷了一整天
- 使用eclipse中的tcp/ip监听webservice请求和响应数据
- 初步使用git clone代码到本地
- 如何在类别中添加属性
- Scala简介
- init() 和 onEnter() 的区别
- oc-内存管理之自动释放--我自动释放了我使用的所有对象,但程序占用内存还是偏高,为什么?
- 二次打包
- hibernate缓存机制详细分析
- 主题和母版页 如何在web窗体调用操作母版页内容元素
- java的调用方法行为
- LeetCode_96Unique Binary Search Trees
- 酷狗面试那些事儿
- 使用jsp标签实现进入网站时先执行action Struts2+jsp
- jquery学习