我正在尝试关注Apple的核心数据实用程序教程。这一切都很顺利,直到......
本教程使用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]];
这就是崩溃的地方。对象运行似乎存在(我可以在调试器中看到它),所以我不认为我的消息是零;另一方面,它看起来不像实际上正在接收setProcessID:消息。我显然还在学习这些东西(这就是教程的用途,对吧?),而且我可能正在做一些非常愚蠢的事情。但是,我们将非常感激地提供任何帮助或建议!
===更多信息===
跟进杰里米的建议:
模型中的processID属性设置如下:
NSAttributeDescription *idAttribute = [[NSAttributeDescription alloc]init];
[idAttribute setName:@"processID"];
[idAttribute setAttributeType:NSInteger32AttributeType];
[idAttribute setOptional:NO];
[idAttribute setDefaultValue:[NSNumber numberWithInteger:-1]];
这似乎有点奇怪;我们将它定义为标量类型,然后给它一个NSNumber对象作为其默认值。在关联的类运行中,processID被定义为NSInteger。不过,这应该没问题 - 所有这些都是直接从教程中复制的。
在我看来,问题可能就在某处。顺便说一句,processID的getter方法定义如下:
- (int)processID {
[self willAccessValueForKey:@"processID"];
NSInteger pid = processID;
[self didAccessValueForKey:@"processID"];
return pid;
}
这个方法工作正常;它访问并解包processID(-1)的默认int值。
感谢您的帮助!
答案 0 :(得分:0)
如果您在
上获得EXC_BAD_ACCESS[run setProcessID:[processInfo processIdentifier]];
几乎可以肯定是由于其中一个指针不再指向真实物体。运行已被dealloc'd或processInfo已被dealloc'd。这假设该行不是
之后的下一行代码NSProcessInfo *processInfo = [NSProcessInfo processInfo];
如果是,那么两个对象都应该有效,所以你可能看错了
[self willChangeValueForKey:@"processID"];
或
[self didChangeValueForKey:@"processID"];
如果你有任何物体观察那个钥匙,它们可能会以某种方式变得陈旧。
答案 1 :(得分:0)
这并没有解决我使用willAccessValueForKey的问题,但它解决了一个谜。我将一个实体子类化,但我忘了在模型中设置自定义类。自定义类工作,直到我写了一个方法来发回一个字符串,这是一些属性的串联。该方法几乎与另一个自定义NSManagedObject类中的另一个方法相同。我无法弄清楚为什么一个班级有效,另一个班级没有。一旦我在模型中设置自定义类,它们都可以工作。