2012-04-25 5 views
0

私はARCを使ってsqliteデータベースで検索するアプリケーションを開発しています。なぜiOSのNSMutableArrayのRemoveAllObjectsを削除できないのですか?

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

UISearchBarのtextDidChangeを使用すると、データベースから多くのデータを取得できます。

データベースからデータを検索した後、私は常にNSMutableArrayから次のコードを使用してクリアしています。

[self.myArrayData removeAllObjects]; 

ただし、NSMutableArrayからすべてのデータを削除すると、メモリ割り当てはまだ発生しています。 縮小されません。

次回は、UISearchBarに何かを入力すると、メモリの割り当てが増えています。 10回以上タイピングした後、XCodesとメモリ不足からメモリ警告を受け取ります。

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

+2

詳細を入力する必要があります。 – mydogisbox

+1

メモリがアレイに関連付けられていることをどのように知っていますか? – bbum

+0

私はInstrumentツールを使って追跡しました.10回タイプした後、100MBのメモリが必要です。私はRemoveAllObjectも使用しました。 –

答えて

4

ここには多くの情報はありませんが、NSMutableArrayがデータを保持しているわけではありません。 SQLiteは、最近取得したレコードのキャッシュも保持します。データベースを開いた後でSQLCacheを実行することによって、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)); 
    } 

EDIT:技術的にはあなたがしようとした場合[self.myArrayData removeAllObjects];[self.myArrayData count] == 0た後、あなたの配列を持っていることを確認することができた場合、プログラムは単に10

+0

あなたの役に立つ答えをありがとう。それは私の問題を修正しました。 –

+0

しかし、50回の検索を行った後、お客様の明細書にエラーが発生しました。 "データベースをロードできませんでした。"あれは。 Xコードは、あなたの行にもエラーを表示します。そのエラーは何ですか?どうすればそれを解決できますか? –

+1

あなたは50回も検索した後にのみ投稿したコードにエラーが発生していると言いますか?私のコードは、データベースを開くときに一度だけ実行する必要があります。それは通常、アプリが起動したときに1回だけ発生します。キャッシュをクリアするためにデータベースを閉じる/再オープンする人もいますが、cache_sizeを0に設定しているので、その必要はありません。あなたは本当に各検索のためにデータベースを閉じる/開くべきではありません。代わりに、データベースを開いたままにしてください。 –

1

にキャッシュを設定します10.以下のキャッシュを減らすことはできませんそのオブジェクトを削除し、保持カウントを減らしました...しかし、他のオブジェクトがまだそれらを所有している場合は、実際にはdeallocになりませんでした。オブジェクトはretained以上である可能性があります。

関連する問題