2010-08-07 20 views
1

我正在潜入iOS开发领域,并且有一些关于操纵我在Xcode中创建的简单核心数据对象的问题。使用对象编辑器后,下面的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 

我在这里错过了什么?

非常感谢您的帮助!

+0

作为一般的风格点,我会避免资产化您的属性... – jtbandes 2010-08-07 03:51:20

+0

xcode在生成它们时将它们大写,而不是我 – BeachRunnerFred 2010-08-07 12:49:32

+1

Xcode将它们大写,因为您在我怀疑的实体中有大写字母。你应该避免这一点。 – 2010-08-07 16:14:02

回答

2

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

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

这可能是它不起作用的原因。因为它通常非常简单直接。

文档说:

如果直接实例化管理对象 ,你必须调用指定 初始化 (initWithEntity:insertIntoManagedObjectContext :)。

而且在initWithEntity:insertIntoManagedObjectContext:的文档:

重要提示:此方法是 NSManagedObject的 指定的初始化。你不能 简单地通过 初始化一个被管理的对象发送init。

+0

您应该实际使用'+ [NSEntityDescription insertEntityForName:inManagedObjectContext:]'。没有必要直接使用'-init ...'方法。 – 2010-08-07 16:14:50

4

我会考虑使用mogenerator:

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

的命令行运行它:

mogenerator -m MyAwesomeApp.xcdatamodel -O Classes 

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

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

+2

将此标记为垃圾邮件的人不知道mogenerator的作用。这是与核心数据实体相对应的自动生成代码的完全相关的建议。 – 2010-08-07 19:05:34