10

Tôi đã tìm thấy một số vấn đề khi lưu NSManagedObjectContext bên trong NSOperation với bật ARC. Nếu không có ARC, mọi thứ đều ổn. Nó luôn mang lại EXC_BAD_ACCESS trong quá trình lưu. Mã trông giống như sau:EXC_BAD_ACCESS trên NSManagedObjectContext save method bên trong NSOperation và ARC, tại sao?

//on the main thread 
-(void)someFunc 
{ 
    array = ... //fetching an array of entities from a core data 
    for(SomeEntity * obj in array) 
    { 
     NSSomeOperation * op = [[NSSomeOperation alloc] initWithValue:[obj someField]]; 
     //start an operation 
    } 
} 

//NSSomeOperation implementation 
//... 
- (void)main { 
    //some code 
    NSError * error = nil; 
    [mainContext lock]; 
    if (![mainContext save:&error]) { //<--- HERE EXC_BAD_ACCESS 
     //process error 
    }  
    [mainContext unlock]; 
    //some code 
} 
//... 

Sử dụng [mainContext setRetainsRegisteredObjects: YES] và objectWithID không giải quyết vấn đề này.

EXC_BAD_ACCESS (mã = 1)
EXC_BAD_ACCESS (mã = 13)

-[__NSCFType contextDidSave:]: unrecognized selector sent to instance 0x7fc5c505d940 

An observer of NSManagedObjectContextDidSaveNotification illegally threw an exception. 

Objects saved = { 
    inserted = "{(\n)}"; 
    updated = "{(\n <SomeEntity: 0x7fc5c55b6220> (entity: SomeEntity; id: 0x7fc5c5052b20 ...)}"; } 
and exception = -[__NSCFType contextDidSave:]: unrecognized selector sent to instance 0x7fc5c505d940 with userInfo = (null) 

tôi sử dụng một bối cảnh đối tượng được quản lý riêng biệt và lấy đối tượng quản lý của tôi bên NSOperation này.

Có thể đó là nội dung liên quan đến lỗi lõi dữ liệu hoặc ARC? Có lẽ ARC làm sạch một số đối tượng, phải được lưu? Bởi vì, không có mọi thứ ARC đều ổn, tất cả đều hoạt động. Khi tôi bật ARC - EXC_BAD_ACCESS.

Có ai biết tại sao nó xảy ra không?

+2

Đây có phải là chủ đề chính không? – Jim

+2

Không, Jim. Đây là bên trong NSOperation, trên một thread khác. –

+3

Được rồi, lý do tôi hỏi là vì bạn có thể thêm NSOperation vào hàng đợi chính (sử dụng NSOperationQueue mainQueue] addOperation: ...] .Nếu đây là một chuỗi thứ hai hoặc hàng đợi, bạn có đang theo tài liệu Apple để sử dụng riêng biệt không ngữ cảnh đối tượng được quản lý và hợp nhất các thay đổi của bạn trở lại ngữ cảnh trong hàng đợi chính? – Jim

Trả lời

26

Có lẽ ARC deallocates một số đối tượng nhận được NSManagedObjectContextDidSaveNotification và điều này gây ra ngoại lệ? Tôi đã có một cái gì đó tương tự, và cố định nó bằng cách đảm bảo removeObserver: trước khi đối tượng được deallocated.

Lưu ý rằng ngoại lệ CoreData thực sự ẩn ngoại lệ của trung tâm thông báo, vì vậy bạn không thể nhìn thấy nó.

+1

Cảm ơn Yonat! Vâng, chắc chắn bạn đúng rồi. Tôi đã cố gắng để removeObserver: - và nó không giúp đỡ. –

+4

nhấp vào dấu kiểm nếu điều này hoàn toàn đúng! :-) – griotspeak

+0

Tôi gọi là 'removeObserver:' trong 'dealloc' của singleton của tôi với ngữ cảnh dùng chung. Loại bỏ 'dealloc' giải quyết vấn đề, nhưng nơi tôi nên' removeObserver'? –

Các vấn đề liên quan