10

NSCagedObjectContext'i, açık ARC ile NSOperation içinde kaydederken bazı sorunlar buldum. ARC olmadan her şey daha önce iyiydi. Kaydetme sırasında her zaman EXC_BAD_ACCESS verir. [: EVET mainContext setRetainsRegisteredObjects] ve objectWithID bu sorunu çözmezse kullanılmasıEXC_BAD_ACCESS, neden?

//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 
} 
//... 

: Kod şöyle görünür.

-[__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) 

EXC_BAD_ACCESS (kod = 1)
EXC_BAD_ACCESS (kod = 13), ayrı bir yönetilmiş nesne içeriğini kullanır ve bu NSOperation içinde Yönetilen nesneler getir.

Belki de Temel Veri hataları veya ARC ile ilgili bir şey? Belki ARC, kaydedilmesi gereken bazı nesneleri temizler mi? Çünkü, ARC olmadan her şey yolundaydı, hepsi işe yaradı. ARC - EXC_BAD_ACCESS öğesini açtığımda.

Neden oluştuğunu bilen var mı?

+2

Bu ana iş parçacığında mı? – Jim

+2

Hayır, Jim. Bu NSOperation içinde, başka bir iş parçacığında. –

+3

Tamam, sormamın nedeni, ana kuyruğa bir NSOperation ekleyebileceğiniz (NSOperationQueue mainQueue kullanarak) addOperation: ...]. Eğer ikincil bir iş parçacığında veya sıradaysa, Apple belgelerini ayrı ayrı kullanacaksınız yönetilen nesne bağlamı ve değişiklikleri ana sıradaki bağlamda yeniden birleştirmek? – Jim

cevap

26

Belki ARC, NSManagedObjectContextDidSaveNotification alan bir nesne ayırır ve bu durum istisna neden olur? Benzer bir şey vardı ve nesneyi deallocated önce removeObserver: emin yaparak sabitleyin.

CoreData özel durumunun aslında bildirim merkezi istisnasını gizlediğini unutmayın, böylece onu göremezsiniz.

+1

Teşekkürler Yonat! Evet, kesinlikle haklısın. Sadece kaldırılmayı denedim: - ve yardımcı olmuyor. Bu kesinlikle doğru olup olmadığını –

+4

onay işareti tıklayın! :-) – griotspeak

+0

Paylaşılan içerik ile singletonumun 'deaOccess' 'removeObserver:' denir. 'Dealloc' kaldırılıyor sorunu çözüldü, ama nerede kaldırmak' removeObserver'? –

İlgili konular