为什么要使用NSAutoreleasePool?

Mat*_*rix 10 objective-c

考虑以下程序:

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // Insert code here... 
    NSLog(@"Programming is Fun !"); 
    [pool drain]; 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么pool需要这样,因为同样的程序也可以写成:

int main (int argc, const char * argv[]) { 
    NSLog(@"Programming is Fun !"); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用自动发布池的目的是什么?我们为什么以及何时需要它们?它们在每个客观C程序中都是必需的吗?

如果我不想自动释放任何对象,我是否还需要使用自动释放池?

Iva*_*ica 8

NSObject包含一个称为的简洁函数autorelease.这意味着Objective-C中的所有对象都包含此功能.

此函数插入self自动释放池,延迟对对象release函数的调用,直到释放自动释放池.大多数内部API使用自动释放池,在位于其中的内部API中main(),每次传递都会在UIKit的主循环中分配和释放一个.

简而言之:它是参考计数器延迟递减的队列.

隐藏自动释放的示例:

[NSString stringWithUTF8String:"some string"];
Run Code Online (Sandbox Code Playgroud)

分配此对象,并在其上调用autorelease.你会如何自己使用它?

MyObject *obj = [[[MyClass alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)

为什么这样好?当您返回此对象时,调用函数不需要注意释放此对象,并且可选地它可以保留它(但不必).


四年后扩大和澄清:

虽然UIKit和AppKit NSAutoreleasePool在其主要运行循环过程中创建并排空,但在非GUI程序中,您需要自己创建它.各种代码都希望有一个NSAutoreleasePool礼物,既然你没有初始化一个GUI框架,也没有使用它,那么就没有代码可以为你神奇地创建它.

虽然你的例子中NSLog()的常量NSString不需要池,但即使是普通的[NSMutableArray array],也可以实际解释为[[[NSMutableArray alloc] init] autorelease].


Yuj*_*uji 8

但如果我不想自动释放任何对象,那么我还需要使用自动释放池吗?

另请注意,Cocoa库autorelease广泛使用.因此,即使您认为不在代码中使用池,也需要准备池.