0

ARCを使用してsqliteデータベースで検索するアプリを開発しています。

UISearchBar の textDidChange イベント時に取得したデータを表示するには、データベースから NSMutableArray にデータを取得する必要があります。

UISearchBar の textDidChange のときに、データベースから多くのデータを取得しています。

データベースから大量のデータを取得した後、次のコードで NSMutableArray から常にクリアしています。

[self.myArrayData removeAllObjects];

ただし、 NSMutableArray からすべてのデータを削除しても、メモリ割り当てはまだ発生しています。減りません。

次回UISearchBarに何かを入力すると、メモリ割り当てがまだ増加しています。10 回以上入力した後、XCodes からメモリ警告が表示され、メモリが不足しています。

removeAllObjects メソッドを呼び出したときに NSMutableArray からのデータが明確でない理由を知りたいです。ARC でアプリを開発しています。私を助けてください。

4

2 に答える 2

4

ここには多くの情報はありませんが、データを保持している NSMutableArray ではない可能性があります。SQLite は、最近取得したレコードのキャッシュも保持します。データベースを開いた後にこれを実行することで、SQLCache を削減/削除できます。キャッシュ サイズを、SQLite にキャッシュさせたいページ数に設定します。デフォルトは 2000 です。各ページのサイズは 1024 バイトです。

    const char *pragmaSql = "PRAGMA cache_size = 0";
    if (sqlite3_exec(database, pragmaSql, NULL, NULL, NULL) != SQLITE_OK) {
        NSAssert1(0, @"Error: failed to execute pragma statement with message '%s'.", sqlite3_errmsg(database));
    }

編集: 技術的には、キャッシュを 10 未満に減らすことはできません。しようとすると、プログラムは単純にキャッシュを 10 に設定します。

于 2012-04-25T16:46:28.243 に答える
1

配列がそのオブジェクトを削除し、それらの保持カウントを減らしたことを確認できた後[self.myArrayData removeAllObjects]; [self.myArrayData count] == 0...しかし、他のオブジェクトがまだそれらを所有している場合、それらは実際にはdealloc編集されません...したがって、オブジェクトが過剰retainedになり、そのためにリークするか、それらがリークする可能性があります別のものに所有されているだけかもしれません。

于 2012-04-25T22:51:56.117 に答える