- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
有时,在使用 Core-Data 对象时,应用程序会因错误而崩溃:
CoreData: error: NULL _cd_rawData but the object is not being turned into a fault
根据我在互联网上的研究和阅读,当托管对象上下文在两个线程之间传递并且 MOC 不是线程安全时,就会发生这种情况。
每当我想从 CD 对象访问属性时,就会出现此崩溃。
如果我有 Person 对象并想访问 Perosn.name 应用程序可能会因此错误而崩溃(如前所述,据我所知,它随机发生并且我无法重现它,有时它会在一个周期内发生 10 次排,然后一两天都不会发生)。
在看这个问题的时候,好像是在我获取Person并更新Person的好友关系时发生的(这个是在后台线程完成的,保存并合并到主线程MOC)。
我想了解更多关于这里发生的事情的信息,为什么会出现这个错误,因为它看起来很随机,是否有任何方法可以防止崩溃。
下面是保存上下文的代码:
__block MyAppDelegate *blockSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[blockSelf.managedObjectContext performBlock:^{
[blockSelf.managedObjectContext save:nil];
dispatch_async(blockSelf.core_data_queue, ^{
[blockSelf.writerContext performBlock:^{
[blockSelf.writerContext save:nil];
}];
});
}];
});
更新 1有时在执行 saveContext 时,会出现以下错误:
"错误域=NSCocoaErrorDomain 代码=1550"操作无法完成。(Cocoa 错误 1550。)
对无效对象的悬挂引用。=null
NSLocalizedDescription=操作无法完成。 (Cocoa 错误 1550。),NSValidationErrorValue=Relationship 'friends' on managed object (0x201cd340)
UID:<4C1B48C8-6309-4E8E-A590-DED497907A3A>。 Assets ID:(空)。带有对象 {(\n '(null)' UID: <(null)>.)}}"
我从另一个 SO 问题中找到了这个答案:“这是由于在不同的上下文中创建的对象,请注意不是在不同的线程上,而是在同一线程上的不同上下文。”
这似乎是这种情况吗?如果是的话,我如何找到在与我要保存到的内容不同的上下文中创建对象的位置...
最佳答案
嗯,我会在该代码中更改一些内容。
使用错误指针,这就是它们的用途。您可能会从中得到解决方案。传入一个 NSError
指针,检查 -save:
调用的返回值,并在失败时将错误输出到控制台。
你的队列管理有点吓人。不要执行 dispatch_async()
,而是将其更改为 -[NSManagedObjectContext performBlock:]
。这将保证您在您正在访问的上下文中处于正确的线程/队列中。按照您编写的方式,没有任何保证,因此可维护性很低。
一旦您进行了这两项更改但仍然失败,请使用 NSError
对象的输出更新您的问题,我们可以看到发生了什么。
即使保存时没有发生错误,您仍然希望检查返回值和错误,因为它可以为我们提供缺失的信息。
如果/当您重现崩溃时,请在此处回复。
好的,这往往表明您正在不同的 MOC 中创建对象,然后通过您已经收集到的关系将它们连接起来。您能否发布或描述如何以及何时创建对象?您使用的是什么 MOC?
你也可以发布更新后的保存代码吗?
关于iphone - 解决CoreData错误: NULL _cd_rawData but the object is not being turned into a fault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14590764/
这是一个类作业,用于将有序插入到已排序的链表中。我已经避免访问空指针,并且添加了一些调试输出行以将段错误缩小到 while 循环本身的条件语句。 我可以将一个节点添加到空列表并将具有较小键的节点添加到
一个小型测试程序在 64 位 Linux 上使用 gfortran (4.4.5) 返回段错误。 n=2_8**22_8 时不存在故障。 gdb 指示在循环的第一次迭代期间函数 mylen 中发生段错
我正在使用 Spring-WS,当我通过 webServiceTemplate 中的 marshalSendAndReceive 调用 Web 服务时,我收到错误代码为 500 的 SOAP 错误。不
我有一个具有此方法的单例数据管理器: -(NSArray*)fetchItems { NSEntityDescription *entity = [NSEntityDescription
我有一个调用 Web 服务的 Java 应用程序 (A)。 1)然后我有另一个使用 A jar 的应用程序 (B)。调用成功,返回需要的数据。 2)然后我有一个也使用A jar 的网络应用程序。在这种
我正在 Java 应用程序中对第三方网络服务进行 SOAP 网络服务调用。用于查找 Web 服务、传输数据和发出 SOAP 请求的 Java 类是使用来自 WSDL 的 Apache CXF 库生成的
我正在尝试学习 SOAP 协议(protocol)。因此,在使用以下命令借助 wsimport 生成 net.webservicex 代码后 C:\Program Files\Java\jdk1.8.
我正在构建一个基于配备 arm64 CPU 的 UltraScale+ FPGA 的数据采集系统。数据通过 DMA 传输到 RAM。驱动程序中的 DMA 缓冲区保留如下: virt_buf[i] =
我使用 QtDesigner 创建了两个对话框“listdialog.ui”和“editdialog.ui”,已发布使用Qt5.3.1,然后添加到项目“phone book.pro”“带有源代码”使用
有谁知道空中交通管制系统是如何实现软件容错的? 一些 URL 会很有帮助。 最佳答案 Lockheed 不久前发表了一些关于此的文章。看看here . 许多系统都使用 Ada,它明确支持验证命题和其他
我认为阅读内存应该不会引起任何问题,例如 char *d=""; char *d2="test"; memcmp(d,d2,10); memcmp() 永远 会失败吗? 最佳答案 您的假设是不正确的,
这个程序在我的 UNIX 机器上导致了段错误。我将原因缩小到 memset() 的第二次调用。 为什么会出现这种行为?第一个“ block ”代码与第二个几乎相同,不是吗?为什么 第一次 调用 mem
我很困惑进程在使用虚拟内存时如何可能出现段错误。据我了解,“虚拟”内存允许进程访问所有可用内存,然后将其映射到“实际”硬件内存。通过这种转换,进程怎么可能尝试访问不允许访问的内存部分? 最佳答案 听起
Tritwise操作(向右旋转和疯狂操作)无法正确运行,并在Malbolge编译器/解释器中引发分段错误。 在看到有关Coding Challenges和Code Golf的惊人答案之后,我决定开始在
这是我的代码 #include #include #include /************************************************** a is a poin
我有下面的代码。当我取消注释 temperature(i,j) = anode_temperature 时,我会出现 SegFault。 forall(i=0:Cells(1), j=0:Cells(
我是 C 编程新手,我的代码中出现了段错误。该程序使用返回函数来询问用户他们的银行帐户中有多少钱。稍后我将添加代码来计算利息。感谢您为我查看此内容,因为我很难找出为什么会出现此错误。 #include
为了测试,我编写了一个代码来计算 #include int main(void) { int p, i, primes[50], index; boo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
考虑 const a = [1,2,3] console.log(a[5]) // returns undefined 我是一名 C 和 Fortran 程序员,我预计会发生段错误。这里的内存是如何管
我是一名优秀的程序员,十分优秀!