我在一个已经工作了很长时间的应用程序中发生了一个非常奇怪的错误。
我无法再在CoreData模型中创建我的一个实体。
当我在模型中创建一个特定实体并尝试使用NSLog(@“%@”,obj)打印它时,我收到了这条奇怪的消息:
2011-11-08 13:03:05.936 iLearnFast [31541:15503] - [__ NSCFNumber objectID]:无法识别的选择器发送到实例0xa069e20
当我遍历此对象的属性/关系并将其打印出来时,一个特定的一对一关系会从[obj valueForKey:]返回一个奇怪的值。它返回的值与上面错误消息中提到的指针/对象相同。
我以为我可能在某处损坏了内存,但是我在初始化数据结构时插入代码以在可执行文件的最开始创建实体,并且我遇到了同样的问题。我非常有信心我此时没有出现任何内存错误(并且内存错误会更随机......我可以创建数千个对象,并且相同的实体总是在相同的关系中具有相同的问题,并且没有其他实体有问题)。
在将问题缩小到这一关系之后,我发现我可以通过将关系重命名为其他任何内容来消除错误。自我的应用程序创建以来,该关系被称为“文件”。
我可以通过重命名属性使我的代码重新工作,虽然它会影响我的自动轻量级迁移,但现在我必须处理如何进行更复杂的迁移。
如果有人对可能出现的问题有任何想法,我会非常感激。
这令我感到困惑,真的感觉像Apple的SDK中的一个错误。
我目前正在使用XCode 4.2,同时尝试了iOS5.0和iOS4.3的SDK,两者都有相同的行为。
罗恩
答案 0 :(得分:4)
2011-11-08 13:03:05.936 iLearnFast [31541:15503] - [__ NSCFNumber objectID]:无法识别的选择器发送到实例0xa069e20
我猜你的代码有漏洞。此行表示您尝试访问自定义NSManagedObject中包含的objectID
属性,但由于某种原因该对象不再存在。尝试检查内存泄漏的代码。
答案 1 :(得分:4)
我在使用Core Data的Swift项目中看到了同样的问题。当我将应用程序推送到设备上时,这个问题只引起了人们的注意(它已经在模拟器中工作了一段时间)。
该问题围绕两个实体之间的关系。为了说明问题图像:
在看了一段时间之后,我决定重新命名关系,队长和播放器。请参阅修复图片:
仅在重命名两个'之后关系的错误消失了。
答案 2 :(得分:1)
我有相同的错误消息,在我的情况下,原因是我有关系属性teacher
并创建了只读属性isTeacher
。
此问题由Objective-C名称约定引起:CoreData在获取teacher
属性时感到困惑。不是访问真实关系并给我真实对象,而是将isTeacher
getter与BOOL
类型一起使用,将其转换为NSNumber
并尝试像CoreData关系一样处理它并调用objectID
将isTeacher
重命名为isTeacherLicence
后,问题就消失了。