操作简单的 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 对象时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在迁移时从 iCloud 迁移到本地商店崩溃的应用程序“对象不能为零” - 使用 Core Data
iOS Core Data - 如何避免同时保存多个上下文时崩溃?