0

ファームウェア 4.2.1 (8C148) の iphone 3g で fmdb に問題があります。SQL コマンド (データベースからダウンロード) を含む大きな NSMutableArray があります。NSAutoreleasePool (iphone 3g のメモリ解放の一部) を介して NSMutableArray にデータを入力すると、40 MB 以上の配列が得られます。

次に、次のコマンドを使用します。

 [db beginTransaction];
 for (NSString* sql in updateSQL)
 {
  if (sql!=@"") {
   BOOL fmtest = [db executeUpdate:sql];
   if (!fmtest) {
    NSLog(@"Sql FAIL: %@",sql);
   }
   if ([db hadError]) {
    NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
   }
 }
 // fetches--; // Counter of total updates;
}
[db commit];

更新プロセス中に、40/50 Mb のメモリが割り当てられます。Iphone 3g はそれを処理できず、レベル 1 の警告で惨めに失敗し、最終的に終了します。

iPhone 3GS で試してみましたが、問題なく動作します。

誰もそれをスキップする方法について何か考えがありますか? アプリにバンドルされた大規模なデータベースが既に作成されているため、コアデータを使用できません (これは優れたソリューションですが)。

4

1 に答える 1

1

を使用して呼び出しの間にDBを閉じます

[db close];

使用されなくなったメモリを確実に解放するため。

ほとんどの開発者は、DB 接続を可能な限り開いたままにしようとします。ただし、iPhone では、メモリの制約が最も厳しく、IO が高速であるため、呼び出しごとに DB を繰り返し開いたり閉じたりする方が、ほとんどの場合は高速です。

于 2011-06-15T11:44:26.843 に答える