考虑以下程序:
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程序中都是必需的吗?
如果我不想自动释放任何对象,我是否还需要使用自动释放池?
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].
| 归档时间: |
|
| 查看次数: |
7362 次 |
| 最近记录: |