2011-12-05 21 views
0

一般的なiOSアプリケーションでメモリに問題がありました。CoreDataはあまりにも多くのメモリを使用していました(> 30Mo)。だから私は、使用されるメモリの量を減らすためにできることはすべてやった。 CoreDataメモリ使用量:iOS 5とiOS 4.3の違い?

  • 各カテゴリがあり〜10個のサブカテゴリー(限定されたバイナリデータを持つエンティティ< 10K)

    • ハイレベルカテゴリ(限定されたバイナリデータ< 10Kを持つエンティティ):

      基本的に私のCoreDataモデルは、基本的なカタログモデルがあります

    • 各サブカテゴリは(再び、限定されたバイナリデータ< 10K)〜10の製品
    • 各製品が有する〜10枚の詳細な画像(〜40-70Kデータのより高い量を有する)を有します

    (画像を含む)各項目の詳細項目が割り当て解除された後、私は

    [NSManagedObjectContext refreshObject:項目mergeChanges:NO];ていません(画像をスキップするために)、メモリ内のグラフを削減する

    コールは

    物事は、iOSでかなりうまく動作5+が、iOSの4.3に、私は多くのエラーを取得します。

    時々、エラーは次のとおりです。キャッチされない例外 'NSObjectInaccessibleException' に起因するアプリを終了

    、理由: ' IDとNSManagedObject:。0xbb70480 が無効になっていました'

    「ハンドラーが例外を投げて」、何が間違っているかについての詳細がなく、アプリが殺されることがあります。

    私の質問は以下のとおりです。動作はiOSの5とiOS 4.3と異なっている理由

    • 任意のアイデア?
    • CoreDataで使用されているメモリを減らすための推奨事項はありますか? (取り出しコントローラを解放し、もう使用されていないコンテキストを解放する以外)
  • 答えて

    3

    異なるiOSバージョンのモデルでのメモリ使用の具体的な違いを言うのは難しいです。私の経験では、イメージをコアデータストアに格納することは特にうまく機能しません。一般に、必要なときにのみイメージデータをメモリに保存します。それぞれのカテゴリには4〜7MBの画像データがあるので、問題が発生する前にあまりにも多くのカテゴリを取ることはありません。私がアプリでしたのは、ディスクに画像データを保存し、そのファイル名をストアに保存することでした。イメージは表示のために必要なときにのみロードされ、不要になったら解放されます。これはストアを小さく保ち、フェッチは高速です。

    イメージデータをストアに保存したい場合は、可能な限り最適化する必要があります。フェッチ要求をすべて設定して、イメージデータ以外のすべてのプロパティを取得し、必要なときにイメージにフォールトをかけるようにします。必要がない場合は、イメージデータがフォルトに戻っていることを確認する必要もあります。

    EDIT:コアデータの画像データを格納する理由の詳細が悪い

    画像データを格納するためにコアデータを使用してのもう一つの問題は、そのロードされ、データを保存し、必要なときにだけ行われた場合でもは、非を取ります時間がかかり、読み込み中にメインスレッドをブロックします。イメージデータを格納する場所は、バックグラウンドからロードする必要があります。ファイルストアを使用するのは簡単です。コアデータを使用する場合、新しいコンテキストを作成するバックグラウンドイメージロード/セーブロジックを実装し、イメージデータをロード/セーブします。これをロードすると、UIImageを作成/表示できるように、メインスレッドにデータを渡す必要があります。

    +0

    ありがとう@XJones。 msgstr "" "イメージデータ以外のすべてのプロパティを取得するようにフェッチリクエストを設定し、必要に応じてイメージにフォールトが発生するようにします。それを行う方法? –

    +0

    問題ありません。 'NSFetchRequest'の' propertiesToFetch'プロパティを調べてください。 – XJones

    +0

    ありがとう、私はそれを試してみます。私はこの機能を知らなかった。 –