2011-08-02 40 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'。 –