操作简单的Core Data对象时崩溃

时间:2010-08-07 03:21:53

标签: iphone ipad core-data ios

我正在深入研究iOS开发,我有一些关于操作我在Xcode中创建的简单Core Data对象的问题。使用对象编辑器后,这是Xcode为我生成的类......

@interface Alarm :  NSManagedObject  
{
}

@property (nonatomic, retain) NSNumber * Enabled;
@property (nonatomic, retain) NSString * Label;
@property (nonatomic, retain) NSNumber * Snooze;

@end

@implementation Alarm 

@dynamic Enabled;
@dynamic Label;
@dynamic Snooze;

@end

这是一个代码剪切,我尝试创建一个Alarm对象,我计划添加到我的ManagedObjectContext ...

- (void)saveAlarm:(id)sender {

    Alarm *alarm = [[Alarm alloc] init];

    alarm.Label = [NSString stringWithString:txtLabel.text];    
    alarm.Snooze = [NSNumber numberWithBool:switchSnooze.on];
    alarm.Enabled = [NSNumber numberWithBool:YES];

    [addAlarmDelegate insertNewAlarm:alarm];
    [alarm release]; 
}

我第一次尝试将代码分配给警报的某个属性时,我的代码崩溃了......

alarm.Label = [NSString stringWithString:txtLabel.text];

在控制台中显示以下崩溃消息...

reason: '-[Alarm setLabel:]: unrecognized selector sent to instance 0x5e33640

我在这里错过了什么?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

我会研究使用mogenerator:

http://rentzsch.github.com/mogenerator/

运行它的命令行是:

mogenerator -m MyAwesomeApp.xcdatamodel -O Classes

在-O之后放置的目录是生成的类所在的位置。最棒的是它有更简单的方法在上下文中创建新的管理对象,并且还生成一个可以自定义的类(添加自己的方法),即使从模型中重新生成对象,也不会被删除。

比使用XCode对象生成简单得多。

答案 1 :(得分:2)

您不应直接分配和初始化基于NSManagedObject的对象。你应该使用

[NSEntityDescription insertNewObjectForEntityForName:@"Alarm" inManagedObjectContext:moc];

这可能是它不起作用的原因。因为它通常很直接才能使它发挥作用。

文档说:

  

如果您实例化托管对象   直接,您必须致电指定   初始化   (initWithEntity:insertIntoManagedObjectContext:)。

在initWithEntity中:insertIntoManagedObjectContext:的文档:

  

重要提示:此方法是   指定的初始化程序   NSManagedObject。你不能   简单地初始化一个托管对象   发送它。