当调用具有NSAutoreleasePool的选择器时,为什么Pool中的某些东西在释放后会被分配?

时间:2012-09-18 18:08:51

标签: objective-c nsautoreleasepool

我正在调用一个选择器,我想使用以下

来启动后台进程
[self performSelectorInBackground:@selector(startSync) withObject:nil];

举个例子,假设startSync看起来像这样

-(void)startSync {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    // expensive background process
    Sync *sync = [Sync new];
    [sync performSync];
    [sync release];
    [pool release];
}

真正密集的处理发生在同步对象的“performSync”中。它正在检索一些XML,将其解析为一个数组,然后将其插入到MySQL数据库中。该过程本身似乎工作正常,并且分析仪没有显示任何泄漏,但使用分析器并在运行之前在开始时执行基线堆标记,然后在运行之后再次显示大约5mb增益。据我们所知(没有双关语)我们正在performSync过程中正确分配和释放对象。

问题是我在后台运行这个过程,如果我正在为它创建一个AutoreleasePool,并在后台进程结束时释放它,它不应该在它结束时解除与后台进程相关的所有内容?我没有很好地理解为什么所有分配的对象都没有被破坏。

2 个答案:

答案 0 :(得分:0)

发布只会在事件循环结束时发生

答案 1 :(得分:0)

每次我们进行记录插入时,我们都缺少一个关闭的数据库语句,这会创建更多连接并导致我们的问题。在这样做之后,我们的基线堆标记为1.22mb,我们的结束堆标记为1.22mb,正如我预期的那样。