0

私のコードは、コア データを使用して多くのタスクを実行し、保存しようとすると、エラーなしでクラッシュします。保存のための私のコードは単純です:

[[self managedObjectContext] save:&error];

NSLog(@"Error: %@", error);

エラー行に到達せず、その時点でクラッシュしてホーム画面に戻ります。

診断で「Guard Malloc」以外をすべて選択しました。

これは、save コマンドを実行したときに取得するログです。

CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ?
CoreData: sql: COMMIT
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: INSERT INTO ZENTRY(Z_PK, Z_ENT, Z_OPT, ZLOCATION, ZBOOKMARKED, ZCREATIONDATE, ZENTRYID, ZMESSAGE, ZSECTIONIDENTIFIER, ZTICDSSYNCID, ZVERSION) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
CoreData: sql: COMMIT
CoreData: sql: pragma page_count
CoreData: annotation: sql execution time: 0.0047s
CoreData: sql: pragma freelist_count
CoreData: annotation: sql execution time: 0.0069s

この前にエラーについての言及はありません。アプリをクラッシュさせている原因を知るにはどうすればよいですか?

編集:これは への呼び出しの後に[NSEntityDescription insertNewObjectForEntityForName:@"Entry" inManagedObjectContext:[self managedObjectContext]];発生し、これの前に TICoreDataSync によってコア データ ストアで実行されたメソッドが原因であることがわかりました。そのコードを変更したり、コア データ ストアでの作業から削除したりすることはできません。複数のスレッドでストアにアクセスするのは問題だと思うので、メインスレッドでそれを処理する方法を知る必要がありますか?

4

1 に答える 1

3

明らかに MOC が破損しています。複数のスレッドからアクセスされていますか?

私がすることは、すべての変更(mocが保存可能である場合-一貫性がある場合)で、保存を試みることです。破損が発生した場所がクラッシュするため、問題の場所が少なくとも多かれ少なかれわかります。

私は自分のアプリでこれを行います-実際、すべての開発ビルドは常に保存され、展開ビルドと QA ビルドのみがこれをオフにしています。この方法で多くのバグを見つけました。いくつかの if フラグ ステートメントで保存をラップするか、マクロを記述します。

于 2012-09-30T12:46:38.530 に答える