2011-08-02 42 views
2

我已经在我的iOS应用程序跟踪内存泄漏,我不断用泄漏仪器回来下面的代码:iOS版 - FMDB使用率和内存

NSMutableArray *resultSet = [[NSMutableArray alloc] initWithCapacity:3]; 

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

FMResultSet *rs = [db executeQuery:query,equipmentID]; 
while ([rs next]) 
{ 
    [resultSet addObject: [rs resultDict]]; 
} 
[rs close]; 
[innerPool release]; 

return [resultSet autorelease]; 

这是正确的(在内存方面管理)使用FMDB?这里是仪器泄漏的截图:

leaks

泄漏的详细截图:

detail

回答

1

是的,这是正确的内存管理。 [rs close];行在技术上是不必要的,因为当FMResultSet被解除分配(作为池池的一部分)时它会发生(如果还没有的话)。但明确地把它放在那里很好。

是否有可能过度保留返回数组?

+0

感谢戴夫,是我过保在返回的数组。每个项目被UITableView单元格子类保留(通过一个合成的setter)。这些都在可重用的队列中,可能是我不明白队列的工作原理。 [详细](https://lh6.googleusercontent.com/-ZbnV40_WTrg/TjhOQKjBB4I/AAAAAAAAMtU/1tIUgWIT_MM/s800/leak2.jpg)查看泄漏截图,BaseCell setData方法是唯一没有发布的方法。如果我将[数据发布]添加到basecell上的dealloc,我会崩溃。任何关于为什么当它看起来通过设置者明显保留时会崩溃的想法? – Crake

+1

吸烟枪原来是以下行:'while([rs next]) result = [rs resultDict]; } ....这是在细胞保存其数据后调用的,我相信这样的直接分配是一个坏主意,我将它改为'while([rs next]) result = [ result = [rs resultDict] copy]; }' – Crake

+0

起初我同Crake有关复制字典的建议,但没有必要,因为fmdb已经在调用'copy'。 –