2010-12-29 10 views
3

これは、提供されるソリューションが機能せず、スタックが異なるため、this questionとは異なる状況です。CoreData保存時にiPhoneクラッシュが発生する

データを使用してデータを保存すると定期的にクラッシュします。

スタックトレースは、これが起こっている場所で100%明確ではありませんが、私はそれが呼び出されているこのルーチンだと確信しています。この方法の場合は​​か、それ以降の場合は​​です。

コード:addEntityForType:withName:ため

-(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!!"); 
    } 
} 

コード:

-(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; 
} 

スタックトレース:私は私のアプリのメモリ位置がsymbolocatedされていない理由はわかりません

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 

が、コードパスは2つの呼び出しのみにつながります。この時点で、addEntityForTypeが完全に呼び出され、wineオブジェクト全体の最後の​​の前に、「whereTasted」エンティティの新しいオブジェクトが作成されました。

もう一度同じ手順を実行すると、正常に動作します。これは、新しい場所を追加するときにアプリが実行されていたことと関係していると思うが、わからない。

これをどのようにデバッグして次回この情報が得られるかについてのご意見はありますか?

答えて

0

put @try - @ save around save call。保存中にスローされた例外があるようです:

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(); 
} 
0

は、あなたが "ファイル名を指定して実行> Objective-Cの例外で停止" を有効にしてください。それは、問題の根本原因であった、障害になったオブジェクトへのアクセスがあった場所を見つけることを可能にしました。

+0

私はデバッガでこれを行いましたが、これはXcodeに接続されていないデバイス上にありました... – davetron5000

+0

申し訳ありませんが、私は非常にうまくいきました。私は誤解しました。これは断続的であり、デバッガでは発生しませんか? – westsider

+0

ええ、非常に断続的です。デバッガでそれが起こるように見えない – davetron5000

関連する問題