考虑以下程序:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Insert code here...
NSLog(@"Programming is Fun !");
[pool drain];
return 0;
}我不明白为什么这里需要pool,因为同样的程序也可以写成这样:
int main (int argc, const char * argv[]) {
NSLog(@"Programming is Fun !");
return 0;
}使用自动释放池的目的是什么?为什么以及什么时候我们需要它们?它们在每个objective C程序中都是强制的吗?
如果我不想自动释放任何对象,我是否也需要使用自动释放池?
发布于 2010-09-08 01:40:44
但是如果我不想自动释放任何对象,那么我还需要使用自动释放池吗??
还要注意的是,Cocoa库广泛使用了autorelease。因此,即使您认为在代码中不使用池,也需要准备池。
发布于 2010-09-07 21:51:40
NSObject包含一个名为autorelease的整洁函数。这意味着Objective-C中的所有对象都包含此函数。
此函数将self插入到自动释放池中,延迟对对象的release函数的调用,直到释放自动释放池为止。大多数内部API使用自动释放池,除了位于main()中的池之外,在UIKit的主循环中每次都会分配和释放一个池。
简而言之:它是用于延迟递减参考计数器的队列。
隐藏自动释放的示例:
[NSString stringWithUTF8String:"some string"];此对象被分配,并在其上调用自动释放。你自己怎么使用它呢?
MyObject *obj = [[[MyClass alloc] init] autorelease];为什么这样很好?当您返回这个对象时,调用函数不需要注意释放这个对象,并且可以选择保留它(但不是必须的)。
要在四年后扩展和澄清:
虽然UIKit和AppKit在它们的主运行循环过程中创建和排出NSAutoreleasePool,但在非图形用户界面程序中,您需要自己创建它。各种代码都希望有一个NSAutoreleasePool,因为您既没有初始化GUI框架,也没有使用它,所以没有代码可以神奇地为您创建它。
虽然示例中的NSLog()和常量NSString不需要池,但即使是微不足道的[NSMutableArray array]也需要池,因为它实际上可以解释为[[[NSMutableArray alloc] init] autorelease]。
发布于 2010-09-07 21:52:44
我找到了理由..。如果池不可用,则自动释放的对象不会被释放,您会泄漏内存。在这种情况下,您的程序通常会记录适当的警告消息。
https://stackoverflow.com/questions/3659196
复制相似问题