0

我正在调用一个选择器,我想用它来触发后台进程,如下所示

[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 数据库。该过程本身似乎运行良好,Analyzer 没有显示任何泄漏,但是在运行前使用分析器并在开始时进行基线堆标记,然后在运行后再次显示大约 5mb 的增益。据我们所知(没有双关语),我们在 performSync 过程中正确分配和释放对象。

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

4

2 回答 2

0

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

于 2012-09-19T16:16:29.920 回答
0

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

于 2012-09-18T18:10:31.233 回答