在Objective-C手册中,写着类似
return [[[SomeClass alloc] init] autorelease];
可以完成,然后在任何时候都不需要
release
,即使在接收此对象的函数中也不需要。那谁拥有这个物件呢?什么时候发布? 最佳答案
电流NSAutoreleasePool
会且会在耗尽时照顾释放。IBAction
呼叫被包装到NSAutoreleasePool
中,该呼叫在呼叫后耗尽。
对于所有非IBAction调用,将适用以下条件:
说,您有以下方法:
- (id)foo {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
SomeClass *bar = [self bar]; //bar still exists here
//do other stuff
//bar still exists here
//do other stuff
//bar still exists here
[pool drain]; //bar gets released right here!
//bar has been released
}
- (id)bar {
return [[[SomeClass alloc] init] autorelease]; //bar will still be around after the return
}
考虑另一种情况:
- (void)foo {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//do other stuff
[self bar];
//do other stuff
[pool drain]; //the string from blee would be released right here;
}
- (void)bar {
[self baz];
}
- (void)baz {
NSString *string = [self blee];
}
- (id)blee {
return [NSString string]; //autoreleased
}
如您所见,自动释放的字符串对象甚至不必在创建池的范围中使用或返回。
NSAutoreleasePools存在于堆栈中(每个线程一个),并且自动释放的对象由调用
autorelease
时最顶层的池拥有。更新:
如果您正在处理一个紧密的循环,并且希望在不降低循环速度的情况下将内存适度保持在较低水平,请考虑执行以下操作:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
for (NSUInteger i = 0; i < 1000000000; i++) {
[NSString stringWithString:@"foo"];
if (i % 1000 == 0) {
[pool drain];
pool = [[NSAutoreleasePool alloc] init];
}
}
[pool drain];
但是
NSAutoreleasePool
是高度优化的,因此每个迭代一个池通常不是什么大问题。要完全了解NSAutoreleasePools的工作原理,请阅读此excellent article by Mike Ash
关于objective-c - 谁拥有自动释放对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8158806/