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消息的对象将被放入最顶端的自动释放池中,如果将一个对象放入一个自动释放池中,然后创建一个新的自动释放池再销毁该新创建的自动释放池,虽然这样,但在新创建之前的那个自动释放池是仍未销毁的,当然包括其中的对象也还存在。

0 0
原创粉丝点击