如何使用 NSAutoreleasePool

Posted

技术标签:

【中文标题】如何使用 NSAutoreleasePool【英文标题】:How to use NSAutoreleasePool 【发布时间】:2011-11-23 07:45:35 【问题描述】:

如果我使用 NSAutoreleasePool,在池中创建的每个对象都不应该手动释放吗?它会在池耗尽时释放?

- (void) backgroundRequest
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        urlList = [[NSMutableArray alloc] init];
        target = [[NSMutableArray alloc] init];
      
    //do stuff in here  

    
    [urlList release];
    [target release];

    [pool release];

以上几行是否正确,或者我应该删除[urlList release][target release]重要提示:我会等待解释和答复。谢谢

【问题讨论】:

【参考方案1】:

只有当你有使用 Autorelease 方法的对象时,自动释放池才有效。

如果你使用这个:

urlList = [[NSMutableArray alloc] init];

然后你会想做你自己的发布,是的。但是,如果您这样做:

urlList = [[[NSMutableArray alloc] init] autorelease];

然后你可以让 NSAutorelease 池来处理。

【讨论】:

【参考方案2】:

如果你不想释放urlListtarget,那么你可以使用这个代码:

- (void) backgroundRequest

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        urlList = [[[NSMutableArray alloc] init] autorelease];
        target = [[[NSMutableArray alloc] init] autorelease];
      
    //do stuff in here  

    

    [pool release];

希望这对您有所帮助。

关键是 AutoreleasePool 会处理那些使用关键字 autorelease 自动释放的分配,因此如果您使用该关键字,则不需要释放它。它在 AutoreleasePool 被释放时被释放。

如果您需要更多信息,请在下面给我留言。

【讨论】:

如果我们在做自动释放,那么写池的需要是什么。你能解释一下吗?在主线程上写自动释放池是不是很好。 (根据下面的严重山姆)。 @ArpitParekh:是的,Arpit 最好不要使用自动释放,但由于我们使用的是后台任务,所以我们使用了自动释放池。也是的,感谢您指出错误的代码。再次感谢 您好,现在您编辑的代码不正确。您之前的代码是正确的。我担心的是为什么我们要在 main 方法上编写自动释放池。您已经告诉过后台任务。这是正确的。谢谢 @ArpitParekh:你好 Arpit,这个方法 backgroundRequest 也可以从 NSThread 调用。它的名字暗示它是一个后台请求。希望现在很清楚。 :谢谢伙计。我忘了在你的代码中考虑背景请求方法“名称”。【参考方案3】:

我赞同@Brayden 的回答。我想补充一下。 通常每个线程都有它的自动释放池。例如,查看您的 .main 文件。它有一个与之关联的自动释放池。这样你的主线程就有了一个自动释放池。 现在,当您生成另一个线程时,即尝试在另一个线程上运行一些方法,以及是否要使用类方法进行常见初始化。

eg: NSString *strTem = [NSString stringWithString:AnotherString];

这就是使用自动释放的情况,对于这些功能(方法),您需要拥有自己的单独的自动释放池。

希望这会有所帮助。

【讨论】:

以上是关于如何使用 NSAutoreleasePool的主要内容,如果未能解决你的问题,请参考以下文章

NSRunLoop 和 NSAutoreleasePool,它们是如何交互的?

我如何找到因为缺少 NSAutoreleasePool 而泄漏的线程?

如何启动一个 NSRunLoop,并确保它有一个被清空的 NSAutoreleasePool?

在 MKMapview regionDidChangeAnimated 方法中使用 NSAutoreleasepool 时应用程序崩溃

目标 C:如何在方法具有返回类型的方法中或在具有任何返回类型的覆盖方法中设置 NSAutoreleasePool?

内存泄漏 NSAutoreleasePool [重复]