NSAutoreleasePool autorelease池如何工作?
据我了解,任何用alloc , new或copy创建的东西都需要手动发布。 例如:
int main(void) {
NSString *string;
string = [[NSString alloc] init];
/* use the string */
[string release];
}
然而,我的问题不是这样吗?
int main(void) {
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
NSString *string;
string = [[[NSString alloc] init] autorelease];
/* use the string */
[pool drain];
}
是的,你的第二个代码snippit是完全有效的。
每一次-autorelease被发送到一个对象,它被添加到最内层的autorelease池。 当池被耗尽时,它只会将-release发送到池中的所有对象。
自动释放池只是一种便利,可让您推迟发送-release,直到“稍后”。 “稍后”可能发生在几个地方,但Cocoa GUI应用程序中最常见的是在当前运行循环周期结束时。
NSAutoreleasePool:排水与释放
由于drain
和release
的功能似乎引起混淆,因此可能值得在此澄清(尽管这在文档中已有介绍)。
严格地说,从大局的角度来看, drain
不等于release
:
在引用计数环境, drain
确实执行相同的操作作为release
,所以两者在这个意义上等同的。 要强调的是,这意味着如果您使用drain
而不是release
则不会泄漏池。
在垃圾收集的环境中, release
是无操作的。 因此它没有效果。 另一方面, drain
包含一个暗示,它应该“收集,如果需要”收集。 因此,在垃圾收集环境中,使用drain
帮助系统平衡收集扫掠。
正如已经指出的,你的第二个代码片段是正确的。
我想建议一种更简洁的方式来使用适用于所有环境的自动释放池(参考计数,GC,ARC),并且还可以避免排水/释放混淆:
int main(void) {
@autoreleasepool {
NSString *string;
string = [[[NSString alloc] init] autorelease];
/* use the string */
}
}
在上面的例子中,请注意@autoreleasepool块。 这是在这里记录。
链接地址: http://www.djcxy.com/p/72751.html上一篇: How does the NSAutoreleasePool autorelease pool work?
下一篇: Stack corrupted with @autoreleasepool (ARC, compiled with llvm 3.0, Fastest, Smallest [