このコードは致命的ではない例外で壊れていますが、重大なエラー情報は提供されていません。これは、コア データ エンティティが更新された後です。
-(void) commitBackgroundChangesAndNotify:(NSString *)notification{
NSLog(@"enter commit");
if([self.backgroundMOC hasChanges]) {
NSError *error = nil;
if (!([self.backgroundMOC save:&error])){ // breaks here
NSLog(@"Unresolved Error %@ %@", error, [error userInfo]);
}
// [[NSNotificationCenter defaultCenter] postNotificationName:notification object:nil];
}
NSLog(@"exit commit");
}
ブレークポイントを有効にしているかどうかに関係なく、デバッガーで中断します。デバッガーなしで実行すると、正常に実行されているように見えます。
このコードは、NSOperation 中に数回実行されます。操作中に、保存のために 2 回目に呼び出されたときに中断が発生します (つまり、コンテキストへの変更は既に 1 回正常に保存されています)。変更とコミットが行われているのと同じスレッドで backgroundMOC が作成されたことを確認しました。これは NSOperation のスレッドです。mocのinsertObjects、updatedObjects、deletedObjectsのカウントも調べました。これらはすべて正しく見えます。
呼び出しコードは次のようになります。
- (void) calculateBoundsForSearch {
NSArray *searchesArray = [currentSearchEntity.resultOfSearch allObjects];
MyMKMapBounds bounds = [MapController calculateBoundsForArrayOfSearchResults:searchesArray];
currentSearchEntity.minLatitude = [NSNumber numberWithFloat:bounds.min.latitude];
currentSearchEntity.minLongitude = [NSNumber numberWithFloat:bounds.min.longitude];
currentSearchEntity.maxLatitude = [NSNumber numberWithFloat:bounds.max.latitude];
currentSearchEntity.maxLongitude = [NSNumber numberWithFloat:bounds.max.longitude];
[dataInterface commitBackgroundChangesAndNotify:@"bounds"];
}
これは 2 つのオブジェクトによって呼び出されます。一つには、例外はありません。
コンソールの唯一の出力は次のとおりです。
2012-07-22 10:47:13.790 myApp[46578:17e07] enter commit
Catchpoint 7 (exception thrown).2012-07-22 10:47:21.160 myApp[46578:17e07] exit commit
これは致命的ではない例外です。私が理解していないことに気付いたのは、それが壊れたときに、それを乗り越えるために続行を2回クリックする必要があることです. 最初のクリック後にメッセージCatchpoint 7 (exception thrown).
が表示されます。
例外の原因を特定するために手元にあるツールを見つけようとしています。もちろん、例外の原因についてのアイデアも役に立ちます。