【问题标题】:NSManagedObject changes reference in blockNSManagedObject 更改块中的引用
【发布时间】:2015-02-10 08:45:23
【问题描述】:

我有一个 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 个测试一起运行时,它失败了。作为拆解的一部分,销毁核心数据存储。但是,在测试运行期间不会调用此方法(使用断点进行验证)

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多