我正在尝试遵循Apple的Core Data Utility Tutorial。一切进展顺利,直到...
本教程使用NSManagedObject的自定义子类,称为“运行”。 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,以准备设置运行对象的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]];
那就是它崩溃的地方。对象运行似乎已经存在(我可以在调试器中看到它),所以我不认为自己传递的消息是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值。
感谢你目前的帮助!
最佳答案
如果您正在获取EXC_BAD_ACCESS
[run setProcessID:[processInfo processIdentifier]];
几乎可以肯定,由于其中一个指针不再指向真实对象。运行已被取消分配,或者processInfo已被取消分配。假设该行不是之后的下一行代码
NSProcessInfo *processInfo = [NSProcessInfo processInfo];
如果是的话,那么两个对象都应该是有效的,因此您可能正在寻找问题
[self willChangeValueForKey:@"processID"];
要么
[self didChangeValueForKey:@"processID"];
如果您有任何对象在观察该键,则它们可能已过时。
关于objective-c - OS X Core Data Utility教程崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2772596/