NSAutoreleasePool

autorelease pool不是天生的,需要手动创立。只不过在新建一个iphone项目时,xcode会自动帮你写好。autorelease pool的真名是NSAutoreleasePool。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSAutoreleasePool内部包含一个数组(NSMutableArray),用来保存声明为autorelease的所有对象。如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中去。

ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1,把此对象加入autorelease pool中

NSAutoreleasePool自身在销毁的时候,会遍历一遍这个数组,release数组中的每个成员。如果此时数组中成员的retain count为1,那么release之后,retain count为0,对象正式被销毁。如果此时数组中成员的retain count大于1,那么release之后,retain count大于0,此对象依然没有被销毁,内存泄露。

 

所有标记为autorelease的对象都只有在这个pool销毁时才被销毁。

如果你有大量的对象标记为autorelease,这显然不能很好的利用内存,在iphone这种内存受限的程序中是很容易造成内存不足的。例如:

int main (int argc, c*****t char *argv[])

{

        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        int i, j;

        for (i = 0; i < 100; i++ )

        {

                 for (j = 0; j < 100000; j++ )

                        [NSString stringWithFormat:@"1234567890"];//产生的对象是autorelease的。

        }

        [pool release];

        return (0);

} // main

OC程序中可以嵌套创建多个autorelease pool。在需要大量创建局部变量的时候,可以创建内嵌的autorelease pool来及时释放内存。

 

你可能感兴趣的:(pool,autorelease)