NSManagedObject在块中更改引用

时间:2015-02-10 08:45:23

标签: objective-c core-data objective-c-blocks

我有一个NSManagedObject。在某些情况下,当我访问一个块中的对象时,它会出现一个不同的指针,当我访问该对象的变量时,我得到一个EXC_BAD_ACCESS崩溃。

这是一个简化的代码:

+(void)updateObject:(NSManagedObject *)object{
        NSLog(@"Object %@", object);

[self requestUpdateFromDict:currentDict
                     succes:^(NSURLSessionDataTask *task, id responseObject)
    {
       NSLog(@"Object %@", object);
       [doSomethingWith:object]
    }];
}

输出例如:

Object <TestObject: 0x7f9fadab1bc0> (entity: TestObject; id: 0xd000000000040004 <x-coredata://5F27CBB5-800D-44B8-BB4B-99A0DE6962E4/TestObject/p1> ; data: {
    floatVar = "2.14";
    "int_32Var" = 99;
    "resource_uri" = "/test";
    stringVar = "Just resting.";
})
Object <TestObject: 0x7f9fad956680> (entity: <null>; id: 0xd000000000040002 <x-coredata://C9D50E1B-46E9-4C11-96BE-622281232D5B/TestObject/p1> ; data: <fault>)

对象的地址似乎已从0x7f9fadab1bc0更改为0x7f9fad956680。

  • 当我在[doSomethingWith:object]放置一个断点并运行“po 0x7f9fadab1bc0“我得到与第一个日志条目相同的输出。
  • 对象didTurnIntoFault在打印两个日志语句之间没有触发。
  • 此方法也在测试中运行,当我单独运行测试时,它会通过。当我与XCTestCase中的其他3个测试一起运行时,它失败了。作为拆解的一部分,销毁核心数据存储。但是,在运行测试期间(通过断点验证)不会调用此方法

1 个答案:

答案 0 :(得分:0)

更改日志记录样式。您对两个日志都有相同的消息。 可能有可能从代码中的其他位置调用updateObject的第二种方法。当你使用NSManagedContext时,最好放一些锁。