这与this question不同,因为提供的解决方案不起作用且堆栈不同。
使用coredata保存数据时定期崩溃。
堆栈跟踪不是100%清楚发生这种情况的地方,但我确定这是正在调用的例程。它可以是此方法中的save:
,也可以是后面的方法。
代码:
-(void)saveWine {
if ([self validInfo]) {
Wine *wine = (Wine *)wineToEdit;
if (wine == nil) {
wine = (Wine *)[NSEntityDescription insertNewObjectForEntityForName:@"Wine" inManagedObjectContext:self.managedObjectContext];
}
wine.uuid = [Utils createUUID];
wine.name = self.wineNameField.text;
wine.vineyard = self.vineyardField.text;
wine.vintage = [[self numberFormatter] numberFromString:self.vintageField.text];
wine.timeStamp = [NSDate date];
wine.rating = [NSNumber numberWithInt:self.ratingControl.selectedSegmentIndex];
wine.partnerRating = [NSNumber numberWithInt:self.partnerRatingControl.selectedSegmentIndex];
wine.varietal = self.currentVarietal;
wine.tastingNotes = self.currentTastingNotes;
wine.dateTasted = self.currentDateTasted;
wine.tastingLocation = [[ReferenceDataAccessor defaultReferenceDataAccessor] addEntityForType:TASTING_LOCATION
withName:self.currentWhereTasted];
id type = [[ReferenceDataAccessor defaultReferenceDataAccessor] entityForType:WINE_TYPE
withOrdinal:self.typeControl.selectedSegmentIndex];
wine.type = type;
NSError *error;
NSLog(@"Saving %@",wine);
if (![self.managedObjectContext save:&error]) {
[Utils showAlertMessage:@"There was a problem saving your wine; try restarting the app" withTitle:@"Problem saving"];
NSLog(@"Error while saving new wine %@, %@", error, [error userInfo]);
}
}
else {
NSLog(@"ERROR - someone is calling saveWine with invalid info!!");
}
}
addEntityForType:withName:
的代码:
-(id)addEntityForType:(NSString *)type withName:(NSString *)name {
if ([Utils isStringBlank:name]) {
return nil;
}
id existing = [[ReferenceDataAccessor defaultReferenceDataAccessor] entityForType:type withName:name];
if (existing != nil) {
NSLog(@"%@ with name %@ already exists",type,name);
return existing;
}
NSManagedObject *newEntity = [NSEntityDescription insertNewObjectForEntityForName:type
inManagedObjectContext:self.managedObjectContext];
[newEntity setValue:name forKey:@"name"];
NSError *error;
if (![self.managedObjectContext save:&error]) {
[Utils showAlertMessage:[NSString stringWithFormat:@"There was a problem saving a %@",type] withTitle:@"Database Probem"];
[Utils logErrorFully:error forOperation:[NSString stringWithFormat:@"saving new %@",type ]];
}
return newEntity;
}
堆栈追踪:
Thread 0 Crashed:
0 libSystem.B.dylib 0x311de2d4 __kill + 8
1 libSystem.B.dylib 0x311de2c4 kill + 4
2 libSystem.B.dylib 0x311de2b6 raise + 10
3 libSystem.B.dylib 0x311f2d72 abort + 50
4 libstdc++.6.dylib 0x301dea20 __gnu_cxx::__verbose_terminate_handler() + 376
5 libobjc.A.dylib 0x319a2594 _objc_terminate + 104
6 libstdc++.6.dylib 0x301dcdf2 __cxxabiv1::__terminate(void (*)()) + 46
7 libstdc++.6.dylib 0x301dce46 std::terminate() + 10
8 libstdc++.6.dylib 0x301dcf16 __cxa_throw + 78
9 libobjc.A.dylib 0x319a14c4 objc_exception_throw + 64
10 CoreData 0x3526e83e -[NSManagedObjectContext save:] + 1098
11 Wine Brain 0x0000651e 0x1000 + 21790
12 Wine Brain 0x0000525c 0x1000 + 16988
13 Wine Brain 0x00004894 0x1000 + 14484
14 Wine Brain 0x00008716 0x1000 + 30486
15 CoreFoundation 0x31477fe6 -[NSObject(NSObject) performSelector:withObject:withObject:] + 18
16 UIKit 0x338c14a6 -[UIApplication sendAction:to:from:forEvent:] + 78
17 UIKit 0x3395c7ae -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 86
18 CoreFoundation 0x31477fe6 -[NSObject(NSObject) performSelector:withObject:withObject:] + 18
19 UIKit 0x338c14a6 -[UIApplication sendAction:to:from:forEvent:] + 78
20 UIKit 0x338c1446 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 26
21 UIKit 0x338c1418 -[UIControl sendAction:to:forEvent:] + 32
22 UIKit 0x338c116a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 350
23 UIKit 0x338c19c8 -[UIControl touchesEnded:withEvent:] + 336
24 UIKit 0x338b734e -[UIWindow _sendTouchesForEvent:] + 362
25 UIKit 0x338b6cc8 -[UIWindow sendEvent:] + 256
26 UIKit 0x338a1fc0 -[UIApplication sendEvent:] + 292
27 UIKit 0x338a1900 _UIApplicationHandleEvent + 5084
28 GraphicsServices 0x35d66efc PurpleEventCallback + 660
29 CoreFoundation 0x314656f8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 20
30 CoreFoundation 0x314656bc __CFRunLoopDoSource1 + 160
31 CoreFoundation 0x31457f76 __CFRunLoopRun + 514
32 CoreFoundation 0x31457c80 CFRunLoopRunSpecific + 224
33 CoreFoundation 0x31457b88 CFRunLoopRunInMode + 52
34 GraphicsServices 0x35d664a4 GSEventRunModal + 108
35 GraphicsServices 0x35d66550 GSEventRun + 56
36 UIKit 0x338d5322 -[UIApplication _run] + 406
37 UIKit 0x338d2e8c UIApplicationMain + 664
38 Wine Brain 0x000021ba 0x1000 + 4538
39 Wine Brain 0x00002184 0x1000 + 4484
我不知道为什么我的应用程序的内存位置没有被符号化,但代码路径只导致两个manavedObjectContext save:
调用。发生这种情况的时间addEntityForType
一直被调用,在整个save:
对象的最终wine
之前为“whereTasted”实体创建一个新对象。
当我再次执行相同的程序时,它工作正常。这让我相信这与应用程序在添加新位置时运行了一段时间有关,但我不确定。
有关如何调试此问题并在下次发生这种情况时获取更多信息的任何想法?
答案 0 :(得分:0)
将@try - @catch放在你的保存电话周围。保存时似乎抛出异常:
9 libobjc.A.dylib 0x319a14c4 objc_exception_throw + 64
样品:
@try
{
if (![self.context save:&error]) {
[[NSApplication sharedApplication] presentError:error];
}
@catch (NSException * e)
{
NSLog(@"exception saving: %@", e);
abort();
}
答案 1 :(得分:0)
您应该尝试激活“运行>停止Objective-C异常”。它允许我找到一个可以访问对象的地方变成了故障,这是问题的根本原因。 (这是最近对我有用的建议。感谢堪察加。)