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

Posted

技术标签:

【中文标题】操作简单的 Core Data 对象时崩溃【英文标题】:Crash when manipulating a simple Core Data object 【发布时间】:2010-08-07 03:21:52 【问题描述】:

我正在深入研究 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

我在这里错过了什么?

非常感谢您的帮助!

【问题讨论】:

作为一般风格点,我会避免将您的属性大写... xcode 在生成它们时将它们大写,而不是我 Xcode 将它们大写,因为我怀疑你的实体中有大写字母。你也应该避免这种情况。 嗨@BeachRunnerJoe 你开发了一个警报应用程序。因为我也在开发一个警报应用程序,但我不想使用本地通知,而是我想在我的警报响起时显示一个自定义页面。请帮助我解决我的问题。我一直坚持这个。请你能给我一些示例代码。 【参考方案1】:

我会考虑使用 mogenerator:

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

运行它的命令行是:

mogenerator -m MyAwesomeApp.xcdatamodel -O Classes

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

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

【讨论】:

无论谁将此标记为垃圾邮件,都不知道 mogenerator 做了什么。这是自动生成与核心数据实体对应的代码的完美相关建议。【参考方案2】:

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

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

这可能是它不起作用的原因。因为让它发挥作用通常很简单。

文档说:

如果你实例化一个托管对象 直接,您必须调用指定的 初始化器 (initWithEntity:insertIntoManagedObjectContext:)。

在 initWithEntity:insertIntoManagedObjectContext: 的文档中:

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

【讨论】:

您实际上应该使用+[NSEntityDescription insertEntityForName: inManagedObjectContext:]。不需要直接使用-init...方法。

以上是关于操作简单的 Core Data 对象时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 中更改托管对象模型的属性值时崩溃

Core Data 对象删除使应用程序崩溃

在迁移时从 iCloud 迁移到本地商店崩溃的应用程序“对象不能为零” - 使用 Core Data

iOS Core Data - 如何避免同时保存多个上下文时崩溃?

将可转换的 NSAttributedString 保存到 Core Data 时出现异常奇怪的崩溃

将对象添加到 NSSet 时与 Core Data 的反比关系导致崩溃