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
,而且我再也没有遇到这个错误。
我怀疑有一个优雅的方式来通过设置NSManagedObject
或NSEntityDescription
的属性在XCode中做同样的事情。
采取以下步骤
1)通过Xcode创build了一个新版本的核心数据模型。
2)修复关系(增加了两者之间的新关系)。
创buildpipe理对象关系
3)重新创buildNSManagedObject子类