1

これは私がいつも聞きたかった質問です。プロファイラーでiOSアプリケーションを実行して割り当ての問題を探していると、NSManagedObjectが使用および表示された後も長い間メモリに残り、リコールしたUIViewControllerの割り当てが解除されていることがわかりました。もちろん、UIViewControllerが再度割り当てられた場合、その数は増えていません。これは、リークがなく、CoreDataによる何らかのオブジェクトの再利用があることを示しています。

名前として「mobjc」が指定されたMyManagedObjectクラスがある場合、プロファイラーで次の数が増加していることがわかります。

MyManagedObject_mobjc_

数は変わる可能性があり、少量のデータ、たとえばsqlliteの100オブジェクトの場合、その制限まで増加し、そこにとどまります。

ただし、アプリケーションのライフサイクル中にオブジェクトの割り当てが解除されることもあるようです。そのため、CoreData自体が何らかのメモリ最適化を行っていると思います。また、ライブバイトサイズが小さいため、オブジェクト全体が保持されるのではなく、オブジェクトの「障害」が保持されるようです(私の英語はご容赦ください:-))。タフな多くの障害オブジェクトでさえ、メモリを占有します。

しかし、この時点で私はいくつかの確認をしたいと思います:

  • CoreDataは本当にメモリ内のオブジェクトを管理および最適化していますか?
  • アプリケーションが保持するオブジェクトをできるだけ少なくするためにできることはありますか?
  • 上記の点に関連して、私は本当にこの問題に対処する必要がありますか?
  • この特定の主題が説明されている、おそらくAppleによるリンクがありますか?

おそらくそれは関連性があります、私がテストに使用したアプリはARCとiOS5.1に依存しています。

ありがとう

4

1 に答える 1

2

このSOトピック、Core Data Memory Managementでは、探している情報を見つけることができます。

代わりに、これはCore DataMemoryManagamentに関するAppleドキュメントへのリンクです。

ここにいくつかのヒント。

まず、Core Dataを扱うときは、オブジェクトグラフを扱います。メモリ消費を減らすために(グラフを整理するために)、使用しているコンテキストでを実行するか、オブジェクトをresetメソッドに渡すファウトに変えることができます。その方法に合格すると、保存されていない変更が失われる可能性があるため、注意してください。NOrefreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flagNO

さらに、必要がない場合はUndoManagementを使用しないでください。これにより、メモリ使用量が増加します(iOSのデフォルトでは、undoマネージャーは作成されません)。

お役に立てば幸いです。

于 2012-06-27T10:05:29.727 に答える