在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/

10-10 22:29