2011-08-02 7 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セルのサブクラスによって(合成されたセッターを介して)保持されます。これらは再利用可能なキューにあり、キューがどのように動作するか分からないことがあります。 [詳細](https://lh6.googleusercontent.com/-ZbnV40_WTrg/TjhOQKjBB4I/AAAAAAAAMtU/1tIUgWIT_MM/s800/leak2.jpg)リークのスクリーンショットを見ると、BaseCellのsetDataメソッドだけがリリースされていません。ベースセルのdeallocに[data release]を追加するとクラッシュします。それがセッターを介して明確に保持されるように見えるとき、これがなぜクラッシュするのかについてのアイデアはありますか? – Crake

+1

喫煙銃は次のようになった。 'while([rs next]) { result = [rs resultDict]; } '....これは、セルがデータを保存した後に呼び出されていました。このような直接の割り当ては悪い考えです。私は' while([rs next])に変更しました。 { result = [rs resultDict]コピー]; } ' – Crake

+0

最初に私は辞書のコピーについてCrakeに同意しましたが、fmdbが既に 'copy'を呼び出しているので、これは必要ではありません。 –

0

SQLiteはメモリを一括して割り当て、保持します。データベースのクローズ時にのみ解放されます。また、 'pragma cache_size = nnn'コマンドを発行することによって、割り当てられるメモリー量を調整することもできます。

この関連質問と回答を参照してください:

memory leak (?) after sqlite+fmdb vacuum command