【问题标题】:iOS - FMDB usage and memoryiOS - FMDB 使用和内存
【发布时间】:2011-10-18 07:59:27
【问题描述】:

我一直在跟踪我的 iOS 应用程序中的内存泄漏,并且我一直使用泄漏工具返回以下代码:

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

【问题讨论】:

    标签: objective-c ios sqlite fmdb


    【解决方案1】:

    是的,这是正确的内存管理。 [rs close]; 行在技术上是不必要的,因为它会在 FMResultSet 被释放时(作为池耗尽的一部分)发生(如果还没有的话)。但是明确地放在那里就可以了。

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

    【讨论】:

    • 谢谢戴夫,是的,我过度保留了返回数组。每个项目都由 UITableView 单元子类保留(通过合成的设置器)。这些在可重用队列中,可能是我不了解队列如何工作的内容。 detail 查看泄漏截图,BaseCell setData 方法是唯一没有发布的方法。如果我将 [data release] 添加到 basecell 上的 dealloc,我会崩溃。当它看起来通过设置器明确保留时,为什么会崩溃?
    • 确凿无疑的是以下行:'while ([rs next]) { result = [rs resultDict]; }' .... 这是在单元格保存其数据后调用的,我认为像这样的直接分配是个坏主意,我将其更改为 'while ([rs next]) { result = [[rs resultDict ] 复制]; }'
    • 一开始我同意Crake关于复制字典的意见,但没有必要因为fmdb已经在调用copy
    【解决方案2】:

    SQLite 分配并保留一堆内存,只有在数据库关闭时才会释放。您还可以通过发出“pragma cache_size = nnn”命令来调整它将分配多少内存。

    查看此相关问题和答案:

    memory leak (?) after sqlite+fmdb vacuum command

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多