CoreData问题: – :无法识别的select器发送到实例

我刚刚开始使用CoreData,我疯了:(我创build了一个使用CoreData的项目(勾选了框 – 使用CoreData)。创build实体,然后为所有实体创buildNSManagedObject类(我想他们创build实体的“setter”和“getter”方法)。

现在,我#我的AppDeletegate导入所有这些类,并写在我的applicationDidFinishLaunching方法:

(订阅是应用程序中的实体之一)

NSManagedObjectContext *context = [self managedObjectContext]; Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context]; [sbs setTitle:@"OK"]; [sbs setType:@"Tag"]; [sbs setCode:@"cars"]; NSError *error = nil; if (![context save:&error]) { NSLog(@"Couldn't create the subscription"); } 

当我运行这个,我得到这个错误

[NSManagedObject setTitle:]:无法识别的select器发送到实例0x6160550

我不知道为什么会这样。 请帮忙!!! 在此先感谢大家!

添加订阅的标题
Subscriptions.h

@interface订阅:NSManagedObject {
}
@属性(非primefaces,保留)NSString *types;
@属性(非primefaces,保留)NSDecimalNumber *读;
@属性(非primefaces,保留)NSString *标题;
@属性(非primefaces,保留)NSString *代码;
@属性(非primefaces,保留)NSDecimalNumber *新;
@结束

我没有改变任何东西。 就像Xcode创build它一样。

只是提醒一下,不要使用大写的variables名,这可能会影响getter和setter工作不正常。

如果你从数据模型中生成你的NSManagedObject子类,一切都会好起来的,虽然它是@dynamic,setter是由coredata实现的,而且因为它们已经被实现了,所以你不应该改变它来合成。 至less对我来说,在我将@dynamic更改为@synthesize之后,coredata会返回空对象。

不要忘记在数据模型中设置类名称:

在这里输入图像说明

我得到了这个,并在项目上做了一个清理,并修复了它。

我添加了一个核心数据实体的attirbute,而不是重新创buildNSManagedObjectSubclass, 我试图变得花哨,手动添加@property和@dynamic到现有的子类。

这不起作用 ,所以我去了,并通过XCode,这是当我开始得到这个错误(“无法识别select器发送到实例”设置属性的值)的子类重新创build。

所以我通过XCode创build了一个新版本的Core Data Model ,然后清理,删除派生数据, 然后重新创build了NSManagedObject子类 。 这工作。

这可能是创build一个新的数据模型和基于这个新的子类,所以我可能不需要清理或删除派生的数据…但它也没有受到伤害!

两个可能的问题

在.m文件中是否有相应的@dynamic块用于这些属性和?

不要使用大写字母属性,编码约定是至less第一个字母的属性是小写的,以便在编译器合成方法时。

@property (nonatomic, retain) NSString * type; 在.h

@dynamic type; 以.m

变得像

 -(void)setType:(NSString *)atype { .... [self willChangeValueForKey:@"type"]; [self setPrimitiveValue:atype forKey:@"type"]; [self didChangeValueForKey:@"type"]; } -(NSString *)type { return [self primitiveValueForKey:@"type"]; } 

在背景中。 虽然你不能看到有史以来的代码。

案例约定取决于你,但骆驼帽与Cocoa名义上是正常的。 但是就像Big Furry Cat变成bigFurryCat 。 按照苹果示例中的样式。

编辑 – 将@synthesize更改为@dynamic

我发现通过与实体的关系,我必须确保我的一些关系是多对多的,我画了一个截图,这样你就可以看到我的意思,一对多关系由双箭头表示

在这里输入图像说明

看起来像标题属性可能不会设置为string。 你有检查吗?

通常情况下,发送给实例的无法识别的select器是一个运行时错误的原因,它通过向对象不知道如何处理的对象发送消息。

 Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context]; sbs.Title = @"OK"; 

希望有所帮助

我在这里做了简单的项目。

我有同样的问题,我发现一个不那么优雅的解决scheme。 看起来

 [NSEntityDescription insertNewObjectForEntityForName:@"myEntity" inManagedObjectContext:myManagedObjectContext]; 

创build一个旧版本的myEntity ,它不具有最新版本的属性。 所以我把旧版本的myEntity的名字改成了myEntity ,而且我再也没有遇到这个错误。

我怀疑有一个优雅的方式来通过设置NSManagedObjectNSEntityDescription的属性在XCode中做同样的事情。

采取以下步骤

1)通过Xcode创build了一个新版本的核心数据模型。

2)修复关系(增加了两者之间的新关系)。

创buildpipe理对象关系

3)重新创buildNSManagedObject子类