2012-08-24 101 views
0

这是一个远射,因为谷歌搜索没有返回任何内容。有时候,往往不够的地方值得进一步调查,但不是经常不够,我可以追查的时候,或者它究竟是如何发生的,我得到下面的异常,当我打电话​​上一个NSManagedObjectContext无法识别的核心数据保存选择器异常

-[_NSObjectID_48_0 _stateFlags]: unrecognized selector sent to instance 0x8675570 

的背景是孩子上下文类型为NSPrivateQueueConcurrencyType,它是NSMainQueueConcurrencyType类型的主要上下文的子节点。

我真的没有比堆栈跟踪其他任何进一步的信息: enter image description here

任何密码学家能做出什么出格的堆栈跟踪变出一些可能的想法,问题可能是什么?

+0

鉴于发生这种情况 - 在“验证” - 它会导致我认为一些托管对象有一个“验证”的方法,并试图发送“stateFlags”的一些其他对象。你有权访问代码或模型吗?你可以搜索源代码吗?您可以在方法“stateFlags”上设置一个断点并“捕捉”发送它的对象。 –

+1

这些消息的问题是,很难找出问题出在哪里。我发现尝试打印“实例0x ....”看看是否看起来很熟悉通常会有所帮助;在gdb中做“po(NSObject *)0x8675570”。如果你幸运的话,你可以重新设计一个你的对象,然后找出你将它传递给你不应该传递给它的东西,或者你必须添加一些东西使它符合某些东西。 –

+0

@DavidH我的任何对象都没有自定义的验证方法,上面看到的所有验证方法都是内部的。即使它不在我的代码中,是否仍然有办法在某处设置断点? @ ChristianStieber好吧,我必须等到下一次我从现在开始出现这个崩溃时,我真的不能重现它。它只是来来去去。我如何使用LLDB打印对象? – Snowman

回答

3

日志消息表明由于某种原因,我们正在寻找_NSObjectID_48_0上的属性/方法_stateFlags,其中一个是私有API,另一个是私有类。

class-dump /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData

一个快速运行似乎表明,(其他地方)_stateFlagsNSManagedObject私有API。我无法在Mac上找到对名为_NSObjectID_48_0的私人类的引用,但仅基于名称,似乎与NSManagedObjectID有关。

这是一个远射,但我想知道你是否在某个时间点通过了NSManagedObjectID,而预期的是NSManagedObject?它不会伤害你的代码,以明确的强制NSManagedObject

另一个罪魁祸首可能是NSManagedObjectID插入到弱类型的数据结构(字典/数组/集我看着你),这可能会让你“胁迫”到NSManagedObject而不明确它。

0

我今年在WWDC上与Xcode工程师讨论过这个问题。当你在调试器中得到这个异常时,你无法告诉任何关于该对象的信息。但是,如果您查看控制台应用程序中的崩溃日志,他们会发现无法响应选择器的对象[我认为这是正确的]。

您需要让应用程序崩溃而不运行调试器 - 因此系统会处理崩溃。

同步您的手机。

打开控制台〜/ Library/Logs/CrashReporter/MobileDevice /,找到崩溃报告并查看报告。我被告知要在这方面输入一个错误 - 那个lldb应该提供相同的细节 - 我做了!

希望这可以帮助你。

5

我们遇到了同样的问题。这是由调用NSManagedObjectContext :: reset引起的。重置将使属于调用重置的上下文的所有NSManagedObjects无效。继续使用已经失效的NSManagedObject实例可能会导致意外的结果。这是那些意想不到的结果之一。

相关问题