3

コアデータを使用するプログラムを作成しましたが、うまく機能します。

それ以来、すべてのコア データ メソッド呼び出しとフェッチ ルーチンを自己完結型のクラスに移動しようとしました。次に、私のメイン プログラムはそのクラスをインスタンス化し、そのクラスに対していくつかの基本的なメソッド呼び出しを行います。その後、クラスはすべてのコア データを舞台裏で処理します。私が遭遇したのは、コンテキストからマネージド オブジェクトを取得すると、有効なオブジェクトが存在するにもかかわらず、そのプロパティの割り当てが解除され、クラッシュが発生することがあるということです。私はゾンビと遊んでメモリリークを探しました。私が集めたのは、実行ループがおそらくメモリの割り当て解除に関与しているようですが、よくわかりません.

そのメモリが割り当て解除されているかどうかを判断し、アクセスする必要がある場合にコア データを強制的に取得する方法はありますか? 私の managedObjectContext の割り当てが解除されることはなく、fetchedResultsController も割り当てが解除されることはありません。

[managedObjectContext refreshObject:mergeData:] メソッドまたは [managedObjectContext setRetainsRegisteredObjects:] メソッドを使用する必要があるのではないかと考えました。ただし、(私が理解していることから)メモリ集約型になるため、最後のものは最善の策ではない可能性があるという印象を受けています。

これらのエラーは、コア データの呼び出しを別のクラス ファイルに移動したときにのみ表示され、表示されるときはランダムです。

任意の洞察をいただければ幸いです。

-ライアン

4

4 に答える 4

1

私は同様の問題に苦しんでいました。管理オブジェクト クラスを使用しており、そのプロパティをユーザー入力に応じて設定したいと考えています。しかし、プロパティや管理対象オブジェクト全体の割り当てが解除されることもありました。

Apple のドキュメントhttp://developer.apple.com/library/IOs/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMemory.htmlの章「管理対象オブジェクト コンテキストの役割」を読んだ後、管理対象オブジェクトが実行ループが完了するたびに解放されます。

そして、設定するための黄金のアドバイスがあります

[myMangedObjectContext setRetainsRegisteredObjects:YES];

(ビュー コントローラーの init メソッド (私にとっては initWithNibName) で設定する必要がありました。)

ドキュメントで説明されているように、必要なオブジェクトのみを保持することも考慮する必要があります。しかし、それを自分で読んでください。

私が正しくない場合は、私を修正してください。

于 2011-11-14T12:39:59.230 に答える
1

ぶらぶらし続けたいオブジェクトを保持していないように思えます。このようなことをしている場合:

NSArray *array = [moc executeFetchRequest:request error:&error];

返された配列を所有していないため、現在の自動解放プールが空になると、配列が消える可能性が高くなります。これは、実行ループが現在のイベントの処理を終了したときに発生します。

これはすべて憶測です。適切な回答が必要な場合は、コードを投稿する必要があります。

于 2010-04-13T06:53:26.547 に答える
1

あなたの説明に基づいて問題が何であるかを知ることは困難ですが、Core Data メモリ管理ガイドを参照することをお勧めします。管理対象オブジェクトとそのエンティティのメモリ管理について心配する必要はありません (それらは自動的にフェッチされ、障害が発生します)。「プロパティ」について話すとき、ivar に裏打ちされたカスタム プロパティを意味しますか? その場合、これらは必要に応じてreleased indidTurnIntoFaultおよびallocd にする必要があります (おそらくアクセサーで)。

于 2010-04-14T05:39:30.457 に答える
0

また、すべての CoreData フェッチなどを処理するクラスも作成しました。私はいくつかの落とし穴に出くわしたので、ここにいくつかのヒントがあります。(これらの例でメモリ管理エラーが発生した場合は、お知らせください。)

2つのこと:


1) CoreData ハンドラ クラスに「fetchFiredObject」メソッドを作成しました。したがって、次のようにする代わりに、すべての変数を持ち、いわば「完全に羽毛のある鳥」である managedObject を取得したい場合:

aManagedObject *myManagedObject = [myCoreDataHandler.managedObjectStorageArray objectAtIndex:1];
int x = myManagedObject.someVariable.intValue;

代わりに私は:

aManagedObject *myManagedObject = [myCoreDataHandler fetchFiredObjectAtIndex:1];
int x = myManagedObject.someVariable.intValue;

そして、myCoreDataHandler の fetchFiredObjectAtIndex:i メソッドで、配列にアクセスし、インデックス i でオブジェクト キーを見つけ、そのオブジェクト キーに対して fetchRequest を実行し、新たにフェッチされた managedObject を返します。割り当て解除など:D


2) 新しい子 viewController を作成するときは、作成時に親から「myCoreDataHandler」値を入力します。ただし、これは、新しい viewController を作成するコード行の後のコード行で発生します。したがって、myCoreDataHandler のメソッドを使用しようとする子の viewDidLoad 内のコードは、空のオブジェクトを返します。これは、viewDidLoadが、子オブジェクト内のグローバルの値を設定する親の次のコード行の前に完了するためです。そのため、viewDidLoad または viewDidLoad によって呼び出されるローカル メソッド内から「コア データ処理オブジェクト」にアクセスしていないことを確認してください。代わりに、新しい viewController を作成した後に親から呼び出します。

于 2012-06-12T15:57:37.690 に答える