我有一个NSOperation
从核心数据持久性存储中获取一些对象并总结一些总数。有时在正在进行的操作中删除对象,因此发生核心数据错误异常。我尝试/捕获异常,同时总结忽略它,因为我只想跳过无法出错的对象。
然而,当其中一个故障异常发生时(我吞下它),调用在[NSInvocation invoke]
中返回后发生崩溃。在取消引用r10中的值时,这是一个糟糕的内存访问,根据GDB成功运行中的值指向其中一个:
(gdb) x 0x38388348
0x38388348 <OBJC_IVAR_$_NSInvocation._retdata>: 0x00000008
如果发生故障异常,则寄存器中的值为0x02,导致崩溃。
快速谷歌搜索告诉我r10应该被被调用者保存,这意味着当发生此异常时,任何代码都不会恢复它。
有人可以解释一下吗?在谈到这些低级细节时,我不是专家
答案 0 :(得分:0)
我认为你问的是错误的问题。 Cocoa应用程序不应该在正常操作下抛出异常。在进行任何其他操作之前,您需要解决该异常的原因。
您不应该从多个线程访问单个托管对象上下文,或者如果您需要非常小心地锁定它。对一个上下文的多线程访问非常危险,并且可能导致您正在观察的行为。来自核心数据编程指南的"Multi-Threading with Core Data"部分:
如果您想使用托管服务 对不同线程的对象,你 必须锁定其上下文(请参阅NSLocking)。 如果您尝试传递实际对象, 在线程之间共享上下文,等等 在,你必须非常小心 关于锁定(并因此 你可能会否定任何好处 否则你可能来自 多线程)。使用a 跨越不同的托管对象 因此线程很强烈 气馁,如“将军”所述 准则“。
建议您为后台线程使用单独的托管对象上下文(使用相同的持久性存储和托管对象模型),并在那里执行求和操作所需的所有读取。