首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用NSAutoreleasePool?

为什么使用NSAutoreleasePool?
EN

Stack Overflow用户
提问于 2010-09-07 21:47:52
回答 6查看 8.8K关注 0票数 12

考虑以下程序:

代码语言:javascript
复制
int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // Insert code here... 
    NSLog(@"Programming is Fun !"); 
    [pool drain]; 
    return 0;
}

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

代码语言:javascript
复制
int main (int argc, const char * argv[]) { 
    NSLog(@"Programming is Fun !"); 
    return 0;
}

使用自动释放池的目的是什么?为什么以及什么时候我们需要它们?它们在每个objective C程序中都是强制的吗?

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-09-08 01:40:44

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

还要注意的是,Cocoa库广泛使用了autorelease。因此,即使您认为在代码中不使用池,也需要准备池。

票数 8
EN

Stack Overflow用户

发布于 2010-09-07 21:51:40

NSObject包含一个名为autorelease的整洁函数。这意味着Objective-C中的所有对象都包含此函数。

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

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

隐藏自动释放的示例:

代码语言:javascript
复制
[NSString stringWithUTF8String:"some string"];

此对象被分配,并在其上调用自动释放。你自己怎么使用它呢?

代码语言:javascript
复制
MyObject *obj = [[[MyClass alloc] init] autorelease];

为什么这样很好?当您返回这个对象时,调用函数不需要注意释放这个对象,并且可以选择保留它(但不是必须的)。

要在四年后扩展和澄清:

虽然UIKit和AppKit在它们的主运行循环过程中创建和排出NSAutoreleasePool,但在非图形用户界面程序中,您需要自己创建它。各种代码都希望有一个NSAutoreleasePool,因为您既没有初始化GUI框架,也没有使用它,所以没有代码可以神奇地为您创建它。

虽然示例中的NSLog()和常量NSString不需要池,但即使是微不足道的[NSMutableArray array]也需要池,因为它实际上可以解释为[[[NSMutableArray alloc] init] autorelease]

票数 9
EN

Stack Overflow用户

发布于 2010-09-07 21:52:44

我找到了理由..。如果池不可用,则自动释放的对象不会被释放,您会泄漏内存。在这种情况下,您的程序通常会记录适当的警告消息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3659196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档