CoreData - 通过ObjectID检索实体时无法识别的选择器

时间:2011-08-22 20:19:49

标签: objective-c core-data

我正在开发一个使用多个线程进行密集计算以及获取大小数据的应用程序。因此,在尝试使用CoreData设计应用程序时,我正努力成为一名优秀的小开发人员并坚持Apple's concurrency guidelines。基本上,我有NSOperation运行并获取数据。它返回(到主线程中的方法)NSMutableSet,其中包含返回的每个实体的NSManagedObjectID

以下是主线程中我希望再次将NSManagedObjectID转换为实际NSManagedObject子类的方法:

-(void)updateLocalContextWithObjectIDs:(NSMutableSet *)idSet {

    NSMutableSet *entitySet = [[NSMutableSet alloc] init];

    for (NSManagedObjectID *objectID in idSet) {

        [entitySet addObject: (Person *)[[self.dataProvider sharedManagedObjectContext] objectWithID:objectID]];

    }

    self.entitySet = entitySet;
    [entitySet release];

}

我遇到的问题是,当循环运行时,我收到以下错误:

-[Person persistentStore]: unrecognized selector sent to instance 0x619b270

为什么会发生这种情况?在persistentStore对象上调用Person并非由我完成 - 它必须在CoreData内发生并且我没有正确执行某些操作。

提前致谢。

2 个答案:

答案 0 :(得分:4)

问题在于我传递的是一组NSManagedObject而不是NSManagedObjectID s,就像我应该的那样。

这已经解决了。

答案 1 :(得分:1)

如何解决“无法识别的选择器发送到实例0xXXXX bug”

  1. 查找您在代码中调用persistantStore的位置。然后找到你过度释放该对象的位置。

  2. 如果您无法找到释放对象的位置,请运行Instruments with NSZombies ON

  3. <强> Explanition : 即使您的代码未在persistantStore上调用Person,您的计算机也是如此。 Objective-C是一种动态语言,您的计算机有一个指向Person对象的指针,它正在向该对象发送persistantStore。这通常发生在你过度释放你不应该拥有的东西时。对象已经消失,一个新对象已经替换它,但是指针仍然存在,所以当你向该指针发送一条消息时,它会转到现在占据该位置的对象。