【发布时间】:2011-05-29 04:30:12
【问题描述】:
从内部 NSManagedObjectContext -save:我收到这条消息:
断言失败:(_Unwind_SjLj_Resume() 无法返回),函数 _Unwind_SjLj_Resume,文件 /SourceCache/libunwind/libunwind-24.1/src/Unwind-sjlj.c,第 326 行。
节目接收信号:“SIGABRT”。
警告:无法读取符号 /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/符号/开发者/usr/lib/libXcodeDebuggerSupport.dylib (未找到文件)。
当我删除一个具有多对多与运行的实验对象时,会发生这种情况,该对象与样本具有多对多,而样本与数据具有多对一。 Experiment 也有 to-many,Page 有 to-many,Display 有 to-many to Run。我提到这一点是为了指出图表的周期性。这是模型的简化图:
实验是用户与之交互的顶级实体。一个 Experiment 包含多个 Run 对象。运行是从特定时间开始并在稍后时间结束的数据集合。由于可以同时从多个来源收集数据,因此每次运行的每个来源都有一个样本。实验包含数据,需要查看这些数据并与之交互。因此,每个实验都有一定数量的页面对象,每个页面包含一定数量的显示(例如,图表、仪表)。显示器被配置为显示属于实验的某些运行子集。因此,虽然一个实验可能包含几十个运行,但它的一个页面一次只会显示其中几个运行。 Display 实体维护这个列表。显示不是视图。视图将引用 Display 对象,并在 Display 对象发生更改时收到通知。
我一直在使用删除规则,但现在已切换到“无操作”删除规则以及所有这些类的 -prepareForDeletion 方法。这种变化没有任何区别。在这两种情况下,错误消息都是一样的。
有趣的是,当我重新启动应用程序时,所有标记为删除的对象都已删除。
此外,如果 Experiment 没有 Run 对象,则删除不会发生。就此而言,从实验中删除单个运行也是可行的。
我希望有人看到过这样的事情,并可以就导致这种情况的原因提供建议。或者,如果有人对如何获取适用于 iOS 4.2.1 的 libXcodeDebuggerSupport.dylib 有建议,那也可能会有所帮助。
更新:我遵循了找到 here 的建议,并且能够让 Xcode 找到适用于 iOS 4.2.1 的 libXcodeDebuggerSupport.dylib。但这对诊断问题毫无帮助 - 问题仍然存在。
更新 2: 在阅读了一下并下载了 unwind-sjlj.c 版本后,我似乎正在处理类似未捕获异常的问题。我不确定这对我有什么帮助...
更新 3:感谢 Kamchatka,我做了几天前我可能应该做的事情:打开“停止 Objective-C 异常”。这让我看到对已删除对象的引用仍在保留 - 更糟糕的是,键值对观察已删除对象。修复了这个已解决的问题,我能够恢复使用删除规则而不是 -prepareForDeletion 方法。
【问题讨论】:
-
您最初的删除规则是什么?级联一直到数据级别? Display 是否有理由直接访问 Runs 而不是通过 Page/Experiment 树?
-
将 Xcode 更新到 3.2.5 以消除调试器警告。您的设备是 4.2.1,需要 3.2.5 的最新调试符号
-
@Michael:Display 管理为特定页面显示的运行,因此它始终是实验包含的运行的子集。一个特定的实验可能有多个页面,每个页面都有多个显示,每个显示显示一组运行。我希望这是有道理的。
-
@Martin:我正在运行 Xcode 3.2.5,但我很好奇是否可以对它做一些事情(设置?)来启用一些额外的功能。
-
有点道理... :-) 听起来确实有点像您将视觉显示逻辑(页面/显示)与数据逻辑混合在一起。我不知道这是否会导致问题 - 但它正在创建循环链。
标签: iphone core-data nsmanagedobject nsmanagedobjectcontext