10

ARCをオンにしてNSOperation内にNSManagedObjectContextを保存するときにいくつか問題が発生しました。 ARCがなければ、以前はすべてうまかった。保存中は常にEXC_BAD_ACCESSが与えられます。 [mainContext setRetainsRegisteredObjects:YES]を使用してEXC_BAD_ACCESS on NSManagedObjectContext NSOperationとARCの中にメソッドを保存する理由は何ですか?

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

:とobjectWithIDはこの問題を解決していないコードは次のようになります。

-[__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(コード= 1)
EXC_BAD_ACCESS(コード= 13)Iは、別個の管理オブジェクトコンテキストを使用して、このNSOperation内部私の管理オブジェクトをフェッチします。

おそらく、Core DataのバグやARCに関連するものでしょうか?たぶん、ARCはオブジェクトのいくつかをきれいにします。 ARCがなければすべてうまくいっていたので、すべてうまくいきました。私がARC-EXC_BAD_ACCESSをオンにしたとき。

なぜそれが起こるのか分かりますか?

+2

これはメインスレッドですか? – Jim

+2

いいえ、Jim。これは別のスレッドのNSOperation内にあります。 –

+3

これは、NSOperationをメインキュー(NSOperationQueue mainQueueを使用してaddOperation:...]に追加することができるので、私が尋ねる理由です。これはセカンダリスレッドまたはキュー上にある場合、Appleのドキュメントに従って、オブジェクトコンテキストを管理し、バックメインキューの中のコンテキストに変更をマージ – Jim

答えて

26

ARCは、NSManagedObjectContextDidSaveNotificationを受け取るオブジェクトを割り当て解除することがあります。これは例外ですか? 私は似たようなものを持っていましたが、オブジェクトが解放される前に、removeObserver:に確実に修正しました。あなたがそれを見ることがないようにCoreData例外は、実際に、通知センターの例外を隠し

注意。

+1

ありがとうYonat!はい、あなたは絶対に正しいです。私はObserverを削除しようとしました: - それは助けになりません。 –

+4

これが絶対に正しいのであれば、チェックマークをクリックしてください! :-) – griotspeak

+0

共有コンテキストで私のシングルトンの 'dealloc'で' removeObserver: 'を呼び出しました。 'dealloc'の問題を解決しましたが、' removeObserver'をどこに置くべきですか? –

関連する問題