自动释放池
2015-07-23 08:10
375 查看
自动释放池,任何标记为自动释放并因此添加到池中的对象,将在池本身被释放的同时也自动释放,程序可以有多个自动释放池,它们还可以是嵌套的。
如果程序在运行时将产生大量的临时对象,就可能需要在程序中创建多重自动释放池。例如:
在执行此段代码的时候会有大量的临时对象产生,如果就这样一直循环下去,就会存在内存泄露的问题(内存泄露是不再使用的内存没有得到释放,致使我们不能再对次块内存进行使用)。因为这些临时对象会在不断的分配空间直到执行此循环操作的runloop的本次循环结束才会去释放。所以我们只需要稍微做一些修改,添加一个自动释放池,每次循环完了就会去释放在池中的自动释放的对象
自动释放池并不包含实际的对象本身,仅仅是对池释放的时候要释放的对象的引用,通过像当前的自动释放池发送一条autorelease消息,就可以将一个对象添加到其中,以便以后释放。
Cocoa应用程序中的每个线程都会维护一个自己的
如果程序在运行时将产生大量的临时对象,就可能需要在程序中创建多重自动释放池。例如:
for (int i = 0; i < 1000000; i++) { NSString *string = [NSString stringWithString:@"ABC"]; string = [string lowercaseString]; string = [string stringByAppendingString:@"XYZ"]; NSLog(@"%@",string); }
在执行此段代码的时候会有大量的临时对象产生,如果就这样一直循环下去,就会存在内存泄露的问题(内存泄露是不再使用的内存没有得到释放,致使我们不能再对次块内存进行使用)。因为这些临时对象会在不断的分配空间直到执行此循环操作的runloop的本次循环结束才会去释放。所以我们只需要稍微做一些修改,添加一个自动释放池,每次循环完了就会去释放在池中的自动释放的对象
for (int i = 0; i < 1000000; i++) { @autoreleasepool { NSString *string = [NSString stringWithString:@"ABC"]; string = [string lowercaseString]; string = [string stringByAppendingString:@"XYZ"]; NSLog(@"%@",string); } }
自动释放池并不包含实际的对象本身,仅仅是对池释放的时候要释放的对象的引用,通过像当前的自动释放池发送一条autorelease消息,就可以将一个对象添加到其中,以便以后释放。
Cocoa应用程序中的每个线程都会维护一个自己的
NSAutoreleasePool对象的堆栈。当一个线程终止时,它会自动地释放所有与自身相关的自动释放池。在基于Application Kit的应用程序中,自动释放池会在程序的主线程中被自动创建和销毁,所以,您