2016-02-26 54 views
0

我有IOS9之前工作的代碼。在我編譯了一些其他更改後,代碼現在在下面的代碼中的行與BAD ACCESS消息一起死亡。我不能理解爲什麼這個曾經工作,現在它沒有。setPersistentStoreCoordinator核心數據不良訪問

[_managedObjectContext setPersistentStoreCoordinator:coordinator]; < < <此行崩潰 - 錯誤訪問

#pragma mark - Core Data stack 

- (void)setmanagedObjectContext 
{ 
    if (_managedObjectContext != nil) { 
     return ; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 

    if (coordinator != nil) 
    { 
     _managedObjectContext = [NSManagedObjectContext alloc]; 

     **[_managedObjectContext setPersistentStoreCoordinator:coordinator];<<< THIS LINE CRASHES - BAD ACCESS** 

    } 

} 


// Returns the managed object model for the application. 
// If the model doesn't already exist, it is created from the application's model. 
- (NSManagedObjectModel *)managedObjectModel 
{ 
    if (_managedObjectModel != nil) { 
     return _managedObjectModel; 
    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"wrh" withExtension:@"momd"]; 

    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

    return _managedObjectModel; 
} 

// Returns the persistent store coordinator for the application. 
// If the coordinator doesn't already exist, it is created and the application's store added to it. 
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (_persistentStoreCoordinator != nil) { 
     return _persistentStoreCoordinator; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"wrh.sqlite"]; 

    NSError *error = nil; 

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return _persistentStoreCoordinator; 
} 
+0

否[[_managedObjectContext initWithConcurrencyType:...]'? – Willeke

+0

謝謝你的回覆,但我不明白你在說什麼?我應該在某處添加嗎?正如我所說,這在IOS 9之前工作,所以很難想知道現在需要什麼。 –

+0

你改變了什麼? – Willeke

回答

0

我改寫了上述與Willeke提示。我查了一下他的提示,想出了一個更好的方法來做到這一點。這是現在的代碼!

- (void)setmanagedObjectContext 
{ 

    if (_managedObjectContext != nil) { 
     return ; 
    } 

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"wrl.sqlite"]; 

    _managedObjectContext = 
    [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 

    self.managedObjectContext.persistentStoreCoordinator = 
    [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; 

    NSError* error; 

    [self.managedObjectContext.persistentStoreCoordinator 
    addPersistentStoreWithType:NSSQLiteStoreType 
    configuration:nil 
    URL:storeURL 
    options:nil 
    error:&error]; 
    if (error) { 
     NSLog(@"error: %@", error); 
    } 
    self.managedObjectContext.undoManager = [[NSUndoManager alloc] init]; 
} 




// Returns the managed object model for the application. 
// If the model doesn't already exist, it is created from the application's model. 
- (NSManagedObjectModel *)managedObjectModel 
{ 
    if (_managedObjectModel != nil) { 
     return _managedObjectModel; 
    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"wrh" withExtension:@"momd"]; 

    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

    return _managedObjectModel; 
}