【问题标题】:Crash when manipulating a simple Core Data object操作简单的 Core Data 对象时崩溃
【发布时间】: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 你开发了一个警报应用程序。因为我也在开发一个警报应用程序,但我不想使用本地通知,而是我想在我的警报响起时显示一个自定义页面。请帮助我解决我的问题。我一直坚持这个。请你能给我一些示例代码。

标签: iphone ipad core-data ios


【解决方案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...方法。
猜你喜欢
  • 2011-09-02
  • 2018-11-16
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2010-11-16
  • 1970-01-01
相关资源
最近更新 更多