自动释放池

来源:互联网 发布:在线压缩js文件 编辑:程序博客网 时间:2024/05/20 10:22
自动释放池,任何标记为自动释放并因此添加到池中的对象,将在池本身被释放的同时也自动释放,程序可以有多个自动释放池,它们还可以是嵌套的。

如果程序在运行时将产生大量的临时对象,就可能需要在程序中创建多重自动释放池。例如:
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的应用程序中,自动释放池会在程序的主线程中被自动创建和销毁,所以,您

0 0
原创粉丝点击