【发布时间】:2010-05-05 11:10:38
【问题描述】:
我正在尝试遵循 Apple 的核心数据实用程序教程。一切都很顺利,直到...
本教程使用 NSManagedObject 的自定义子类,称为“Run”。 Run.h 看起来像这样:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Run : NSManagedObject {
NSInteger processID;
}
@property (retain) NSDate *date;
@property (retain) NSDate *primitiveDate;
@property NSInteger processID;
@end
现在,在 Run.m 中,我们有一个 processID 变量的访问器方法:
- (void)setProcessID:(int)newProcessID {
[self willChangeValueForKey:@"processID"];
processID = newProcessID;
[self didChangeValueForKey:@"processID"];
}
在 main.m 中,我们使用函数来设置托管对象模型和上下文,实例化一个名为 run 的实体,并将其添加到上下文中。然后我们获取当前的NSprocessInfo,为设置run对象的processID做准备。
NSManagedObjectContext *moc = managedObjectContext();
NSEntityDescription *runEntity = [[mom entitiesByName] objectForKey:@"Run"];
Run *run = [[Run alloc] initWithEntity:runEntity insertIntoManagedObjectContext:moc];
NSProcessInfo *processInfo = [NSProcessInfo processInfo];
接下来,我们尝试调用Run.m中定义的访问器方法来设置processID的值:
[run setProcessID:[processInfo processIdentifier]];
这就是它崩溃的地方。对象 run 似乎存在(我可以在调试器中看到它),所以我不认为我在传递 nil;另一方面,它看起来不像 setProcessID: 消息实际上正在被接收。我显然还在学习这些东西(这就是教程的用途,对吧?),而且我可能正在做一些非常愚蠢的事情。但是,我们将不胜感激地收到任何帮助或建议!
===更多信息===
跟进 Jeremy 的建议:
模型中的processID属性是这样设置的:
NSAttributeDescription *idAttribute = [[NSAttributeDescription alloc]init];
[idAttribute setName:@"processID"];
[idAttribute setAttributeType:NSInteger32AttributeType];
[idAttribute setOptional:NO];
[idAttribute setDefaultValue:[NSNumber numberWithInteger:-1]];
这似乎有点奇怪;我们将它定义为一个标量类型,然后给它一个 NSNumber 对象作为它的默认值。在关联的类 Run 中,processID 被定义为一个 NSInteger。不过,这应该没问题 - 都是直接从教程中复制的。
在我看来,问题可能出在某个地方。顺便说一下,processID 的 getter 方法是这样定义的:
- (int)processID {
[self willAccessValueForKey:@"processID"];
NSInteger pid = processID;
[self didAccessValueForKey:@"processID"];
return pid;
}
而且这种方法效果很好;它访问并解压缩 processID (-1) 的默认 int 值。
感谢到目前为止的帮助!
【问题讨论】:
-
当你说它崩溃时,你得到什么崩溃?它是某种 Objective-C 异常吗?访问不正确?我们需要更多信息。
-
对不起;这是一个错误的访问:程序接收到的信号:“EXC_BAD_ACCESS”。
标签: objective-c cocoa core-data macos