0

我已经(大量)将 NSManagedObject 子类化为一个项目。它在原始项目中无缝地工作,不费吹灰之力。

我将这些文件复制到一个新项目中,手动将适当的 CoreData 类添加到新数据模型中。

不幸的是,我遇到了“问题”。由于某种原因,所讨论的子类的方法被忽略了。两个项目之间的代码完全相同,但我突然遇到了无法识别的选择器问题。

NSFetchRequest *blockRequest=[[NSFetchRequest alloc] init];
NSEntityDescription *blockDesc=[NSEntityDescription entityForName:@"AdBlock" 
                                           inManagedObjectContext:context];
[blockRequest setEntity:blockDesc];

AdBlock *curBlock=[adBlocks objectAtIndex:blockIndex];

adBlocks=[context executeFetchRequest:blockRequest error:nil];

for (AdBlock *block in adBlocks) {
    [block initAdBlock];//Crashes with unrecognized selector
}

我已经检查过了,适当的 .m 文件已添加到编译器构建阶段。代码实际上是复制和粘贴,并且在两个项目之间是相同的——源代码有效,目标代码无效。

我注意到我没有明确告诉上下文它应该返回子类类型,但这在旧项目中不是问题,那么为什么在新项目中会出现问题呢?

4

3 回答 3

1

当这样的事情发生在我身上时,我会尝试两件事。我要做的第一件事是确保我正确地#imported NSManagedObject 子类(我忘记这种方式的频率比我应该的要多),但是正如你所说的你复制和粘贴的,我不认为这是你的问题。我尝试的第二件事是通过转到 File>New>File 然后 NSManagedObject Subclass 然后选择我更改的 NSManagedObjects 来重建 NSManagedObjects。我建议在你的情况下重建所有这些。看看这是否有效。它可能不是,但它是一个容易开始的地方。

于 2012-08-22T04:05:05.747 回答
1

确保检查您的模型并确保您已更改检查器中的类名。否则,无论如何,它们都会以 NSManagedObjects 的形式返回。并使用 mogenerator 所以你不必担心重新生成你的类。

于 2012-08-27T19:43:44.573 回答
1

我知道这个问题已经过时了,但也许有人搜索会发现这很有帮助。

我一直在使用类别向 NSManagedObject 子类添加附加功能。这允许我使用 XCode 命令生成类定义,而不会破坏任何自定义逻辑。罗恩在对所选答案的评论中提到了这一点——只是认为这值得引起注意,因为我发现这是一个非常巧妙的解决方案。

于 2013-09-08T23:05:12.867 回答