2013-09-26 27 views
5

Czasami dostaję ten błąd:EXC_BAD_ACCESS Dzwoniąc managedObjectContext zapisać

EXC_BAD_ACCESS Code: KERN_INVALID_ADDRESS at 0x13421772123 

Zdarza się zapisać na: linia poniżej (w klasie CoreDataController singleton)

NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 

    if (managedObjectContext != nil) { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     } 
    } 

wiem, że to nie jest dużo kodu, ale z doświadczenia wynika, że ​​jest to powszechna przyczyna i jakikolwiek sposób, aby zapobiec awariom aplikacji?

+0

Jest to aplikacja ARC? – bneely

+0

Tak, jest to aplikacja ARC. – soleil

+1

Który wątek uruchamia ten kod? – bneely

Odpowiedz

13

jeśli managedObjectContext jest główny kontekst, to należy nazwać w głównym wątku, spróbuj owinąć go z następującego kodu, okrywać to nazwać w wątku tła

NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 

if (managedObjectContext != nil) { 
    [managedObjectContext performBlockAndWait:^{ 
     NSError *error = nil; 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     } 
    }]; 
} 
+0

Dzięki za sugestię. Otrzymuję to: Wysyłanie "NSError * const __strong *" do parametru typu "NSError * __ autoreleasing *" zmienia właściwości zatrzymania/zwolnienia wskaźnika – soleil

+0

właśnie przesunięto deklarację błędu do bloku, aby uniknąć błędu, patrz zaktualizowane kody alternatywny sposób deklarowania błąd jako __block NSError * error = nil; – lanbo

+0

Oznaczam to jako poprawne na razie, ponieważ jeszcze nie miałem awarii. – soleil

Powiązane problemy