2013-09-26 51 views
5

Thỉnh thoảng tôi nhận được lỗi này:EXC_BAD_ACCESS khi gọi managedObjectContext lưu

EXC_BAD_ACCESS Code: KERN_INVALID_ADDRESS at 0x13421772123 

Nó xảy ra trên lưu: dòng dưới đây (trong một lớp học CoreDataController singleton)

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

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

Tôi biết điều này không phải là một rất nhiều mã để đi từ, nhưng từ kinh nghiệm là có nguyên nhân phổ biến cho điều này, và bất kỳ cách nào để ngăn chặn điều này từ đâm các ứng dụng?

+0

Đây có phải là một ứng dụng ARC? – bneely

+0

Có, đây là ứng dụng ARC. – soleil

+1

Chuỗi nào đang chạy mã này? – bneely

Trả lời

13

nếu managedObjectContext là bối cảnh chính, sau đó bạn nên gọi nó trong chủ đề chính, hãy thử quấn nó với mã sau đây, trong trường hợp bạn gọi nó trong một thread nền

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

Cảm ơn bạn đã đề xuất. Tôi nhận được điều này: Gửi 'NSError * const __strong *' tới tham số kiểu 'NSError * __ autoreleasing *' thay đổi thuộc tính giữ lại/phát hành của con trỏ – soleil

+0

chỉ cần chuyển lỗi khai báo thành khối để tránh lỗi, xem cách cập nhật mã thay thế là khai báo lỗi như __block NSError * error = nil; – lanbo

+0

Đánh dấu chính xác ngay bây giờ, vì tôi chưa gặp sự cố. – soleil