您的位置:首页 > 其它

自动释放池

2015-07-23 08:10 375 查看
自动释放池,任何标记为自动释放并因此添加到池中的对象,将在池本身被释放的同时也自动释放,程序可以有多个自动释放池,它们还可以是嵌套的。

如果程序在运行时将产生大量的临时对象,就可能需要在程序中创建多重自动释放池。例如:

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的应用程序中,自动释放池会在程序的主线程中被自动创建和销毁,所以,您
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: