在NSOperation和ARC内部的NSManagedObjectContext保存方法上的EXC_BAD_ACCESS,为什么?

时间:2012-02-23 18:33:10

标签: objective-c multithreading core-data exc-bad-access automatic-ref-counting

我在NSOperation中使用启用ARC保存NSManagedObjectContext时发现了一些问题。没有ARC,一切都很好。在保存期间始终提供EXC_BAD_ACCESS。代码如下所示:

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

使用[mainContext setRetainsRegisteredObjects:YES]和objectWithID无法解决此问题。

EXC_BAD_ACCESS(代码= 1)
EXC_BAD_ACCESS(代码= 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)

我使用单独的托管对象上下文并在此NSOperation中获取托管对象。

可能是与Core Data错误或ARC相关的东西?也许ARC清理一些必须保存的物体? 因为没有ARC一切都很好,一切都很有效。当我打开ARC - EXC_BAD_ACCESS时。

有谁知道它为什么会发生?

1 个答案:

答案 0 :(得分:26)

也许ARC释放一些接收 NSManagedObjectContextDidSaveNotification 的对象,这会导致异常? 我有类似的东西,并通过在取消分配对象之前确保 removeObserver:来修复它。

请注意,CoreData异常实际上隐藏了通知中心异常,因此您无法看到它。