0

私には一般的なアプリケーションパターンがあります。ユーザーはメインのViewControllerにデータを入力し、それをモーダルViewControllerのテーブルに表示します。ここで行を削除または変更できます。私はスタンフォードiPhoneコースの一般的な設計戦略に従っていましたが、どこかで問題が発生し、SIGABRTと、「異なるコンテキストのオブジェクト間に「xyz」の関係を確立しようとする違法な試み」などの例外が発生しました。

スタンフォードコースと同様に、「データベース」と呼ばれるシングルトンクラスを使用します。このクラスは、要求されるたびに同じコンテキストを返す必要があります。したがって、メインViewControllerのviewDidLoadメソッドの最初のコマンドは次のとおりです。

 dbsingleton = [Database sharedInstance];
 nmocontext = [dbsingleton managedObjectContext];

nmocontextは、ViewController全体で使用するivarです。ユーザーがテーブルを使用して他のViewControllerを表示したい場合は、それをalloc-initしてから、モーダルで表示します。(ストアからのデータを提供するNSFetchedResultsControllerがあります。)ここでさまざまな戦略を試しました。

  • NSFetchedResultsControllerをメインビューコントローラーによって設定された保持プロパティにしました
  • NSManagedObjectContextを、メインビューコントローラーによって設定された保持プロパティにしました。と
  • テーブルビューコントローラーのviewDidLoadメソッドの先頭で上記の2行のコードを繰り返すことにより、内部でシングルトンを使用しました。

どちらを使用しても、解決できない問題の1つは、ユーザーがテーブルビューコントローラー(およびそのNSFetchedResultsController)を閉じてロックを解除した後、ストアにアクセスしたときにメインビューコントローラーでクラッシュが発生し始めることです(「上記の「不正な試行」エラー)。

この一般的なアプリケーションパターンに対処するためのベストプラクティスは何ですか?このアプリケーションをiPhoneSDK3.xと互換性を持たせたいと思っていますが、iOS 4を使用していると、クラッシュが少なくなるようです。3.xに根本的な問題があり、問題が発生している場合は、私に知らせてください。知っているし、私はiOS4のみをターゲットにするかもしれない。

ありがとうございました!

4

2 に答える 2

0

これは単なる推測ですが、テーブルビューを閉じた後のクラッシュについては、次の問題があると思います。

プロパティを宣言しました

@property (retain, nonatomic) NSManagedObjectContext* nmocontext;

あなたはdeallocでivarnmocontextを適切にリリースしますか?はいの場合、あなたの問題は割り当てです

nmocontext = [dbsingleton managedObjectContext];

これにより、ビューコントローラ内にnmocontextが保持されることはありませんが、deallocで解放します。

2番:

「異なるコンテキストのオブジェクト間に関係「xyz」を確立しようとする違法な試み。」

これはメモリ管理の問題ではありませんが、オブジェクトを追加するための別の新しいコンテキストを作成し(Apple Core Data iphoneサンプルのように)、NSManagedObjectを別のコンテキストからの関係として設定しようとした可能性があります。

于 2010-09-12T05:40:09.700 に答える
0

シングルトンが適切に構成されていないようです。

シングルトンはrelease、リリース メッセージが送信されたときに何も起こらないようにオーバーライドする必要があります。オーバーライドしないreleaseと、アプリ内のランダムなコード片がシングルトンを強制終了し、シングルトンを使用する目的全体を無効にする可能性があります。次にシングルトンを呼び出すと、実際には別の新しいオブジェクトが取得され、この場合は新しい管理対象オブジェクト コンテキストも返されます。

Cocoa 基礎ガイド: シングルトン インスタンスの作成 を参照してください。

シングルトンは強力で柔軟ですが、間違いを犯しやすいです。それらは非常に簡単に台無しになるため、多くの経験豊富な開発者は単にそれらの使用を拒否しています. それらの経験がない場合は、始めたばかりのときに使用しないでください。

于 2010-09-14T13:23:33.343 に答える