为什么我的NSManagedObject子类方法无法被识别?

时间:2012-08-22 03:55:21

标签: ios xcode core-data nsmanagedobject

我(大量)为一个项目子类化了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文件已添加到编译器构建阶段。代码完全是字面上的复制和粘贴,并且在两个项目之间是相同的 - 源代码工作,目的地没有。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

确保检查模型并确保在检查器中更改了类名。否则,无论如何,它们都将作为NSManagedObjects返回。并使用mogenerator,因此您不必担心重新生成类。

答案 2 :(得分:1)

我知道这个问题很陈旧,但也许有人会搜索这个问题会有所帮助。

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