2013-09-26 40 views
5

偶爾我得到這個錯誤:EXC_BAD_ACCESS時調用managedObjectContext保存

EXC_BAD_ACCESS Code: KERN_INVALID_ADDRESS at 0x13421772123 

它發生在保存:線下(在CoreDataController單例類)

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

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

我知道這是不是一個很多代碼要走,但是從經驗來看,這有什麼常見的原因,並且有任何方法可以防止這種情況導致應用程序崩潰?

+0

這是一個ARC應用程序調用它呢? – bneely

+0

是的,這是一個ARC應用程序。 – soleil

+1

哪個線程正在運行此代碼? – bneely

回答

13

如果managedObjectContext是主要的背景下,那麼你應該把它在主線程,嘗試用下面的代碼把它包起來,櫃面你在後臺線程

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

感謝您的建議。我得到這個:發送'NSError * const __strong *'參數的類型'NSError * __ autoreleasing *'更改指針的保留/釋放屬性 – soleil

+0

只是移動錯誤聲明塊以避免錯誤,請參閱更新的代碼替代方式聲明錯誤爲__block NSError * error = nil; – lanbo

+0

現在標記爲正確的,因爲我還沒有崩潰。 – soleil

相關問題