CoreData issue: -[NSManagedObject setValue:]: unrecognized selector sent to instance
我昨天刚开始使用coredata,我疯了:(我创建了一个使用coredata的项目(勾选了框-使用coredata)。创建实体,然后为所有实体创建nsmanagedObject类(我认为它们为实体创建了"setter"和"getter"方法)。
现在,我在AppDeleteGate中导入了所有这些类,并在ApplicationDidFinishLaunching方法中编写了这些类:
(订阅是应用程序中的实体之一)
1 2 3 4 5 6 7 8 9 10 | 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:]: unrecognized selector sent to instance 0x6160550
我不知道为什么会这样。请帮助!!!!提前感谢大家!
添加订阅头
订阅.h
@interface Subscriptions : NSManagedObject {
}
@property (nonatomic, retain) NSString * Type;
@property (nonatomic, retain) NSDecimalNumber * Read;
@property (nonatomic, retain) NSString * Title;
@property (nonatomic, retain) NSString * Code;
@property (nonatomic, retain) NSDecimalNumber * New;
@end
我什么都没改变。就像Xcode创建的那样。
只是提醒一下,不要使用大写的变量名,它可能会影响getter和setter工作不正常。
如果您从数据模型生成了nsmanagedObject子类,那么一切都应该正常,尽管它是@dynamic的,setter是由coredata实现的,并且因为它们已经实现了,所以您不应该将其更改为合成。至少对我来说,coredata在我将@dynamic更改为@synthesis之后返回空对象。
别忘了在数据模型中设置类名:
我得到了这个,对这个项目做了一个清理,它修复了它。
我向一个核心数据实体添加了一个ATirbute,而不是重新创建nsmanagedObjectSubclass,我试图得到幻想,并手动将@property和@dynamic添加到现有的子类中。
这不起作用,所以我通过xcode重新创建了子类,这是我开始犯这个错误的时候("为属性设置值时,将无法识别的选择器发送到实例")。
因此,我通过Xcode创建了核心数据模型的新版本,然后清理、删除派生数据,然后重新创建nsmanagedObject子类。效果不错。
它可能正在创建一个新的数据模型和基于该模型的新子类,所以我可能不需要清理或删除派生的数据……但它也没有损害!
两个可能的问题
在.m文件中是否有对应的@dynamic块用于这些属性和
不要使用大写的属性,编码约定是属性对于第一个字母是小写的,至少这样当编译器合成方法时。
和
变得像
1 2 3 4 5 6 7 8 9 10 11 12 | -(void)setType:(NSString *)atype { .... [self willChangeValueForKey:@"type"]; [self setPrimitiveValue:atype forKey:@"type"]; [self didChangeValueForKey:@"type"]; } -(NSString *)type { return [self primitiveValueForKey:@"type"]; } |
在背景中。尽管你看不到代码。
案件惯例由你决定,但骆驼帽在名义上与可可是正常的。但它很像一个物体,如
编辑-将@synthesis更改为@dynamic
我发现,通过与实体建立关系,我必须确保我的一些关系与许多实体建立关系,我截取了一个屏幕截图,这样你就能明白我的意思,一对多的关系是由双端箭头表示的。
采取以下步骤
1)通过xcode创建了核心数据模型的新版本。
2)修复关系(添加新的关系)。)
创建托管对象关系
3)重新创建nsmanagedObject子类
我也遇到了同样的问题,我找到了一个不那么优雅的解决方案。似乎
1 | [NSEntityDescription insertNewObjectForEntityForName:@"myEntity" inManagedObjectContext:myManagedObjectContext]; |
创建一个旧版本的
我怀疑在Xcode中,通过设置
在我看来,标题属性不能设置为字符串。你查过了吗?
通常,发送到实例的无法识别的选择器是一个运行时错误,因为它向对象发送了一个对象不知道如何处理的消息。
1 2 | Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context]; sbs.Title = @"OK"; |
希望帮助
我在这里做了一个简单的项目。