故障异常会导致寄存器导致[NSInvocation invoke]崩溃

时间:2010-06-09 10:33:16

标签: iphone core-data

我有一个NSOperation从核心数据持久性存储中获取一些对象并总结一些总数。有时在正在进行的操作中删除对象,因此发生核心数据错误异常。我尝试/捕获异常,同时总结忽略它,因为我只想跳过无法出错的对象。

然而,当其中一个故障异常发生时(我吞下它),调用在[NSInvocation invoke]中返回后发生崩溃。在取消引用r10中的值时,这是一个糟糕的内存访问,根据GDB成功运行中的值指向其中一个:

(gdb) x 0x38388348
0x38388348 <OBJC_IVAR_$_NSInvocation._retdata>:     0x00000008

如果发生故障异常,则寄存器中的值为0x02,导致崩溃。

快速谷歌搜索告诉我r10应该被被调用者保存,这意味着当发生此异常时,任何代码都不会恢复它。

有人可以解释一下吗?在谈到这些低级细节时,我不是专家

1 个答案:

答案 0 :(得分:0)

我认为你问的是错误的问题。 Cocoa应用程序不应该在正常操作下抛出异常。在进行任何其他操作之前,您需要解决该异常的原因。

您不应该从多个线程访问单个托管对象上下文,或者如果您需要非常小心地锁定它。对一个上下文的多线程访问非常危险,并且可能导致您正在观察的行为。来自核心数据编程指南的"Multi-Threading with Core Data"部分:

  

如果您想使用托管服务   对不同线程的对象,你   必须锁定其上下文(请参阅NSLocking)。   如果您尝试传递实际对象,   在线程之间共享上下文,等等   在,你必须非常小心   关于锁定(并因此   你可能会否定任何好处   否则你可能来自   多线程)。使用a   跨越不同的托管对象   因此线程很强烈   气馁,如“将军”所述   准则“。

建议您为后台线程使用单独的托管对象上下文(使用相同的持久性存储和托管对象模型),并在那里执行求和操作所需的所有读取。