OS X核心数据实用程序教程中的崩溃

时间:2010-05-05 11:10:38

标签: objective-c cocoa core-data macos

我正在尝试关注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值。

感谢您的帮助!

2 个答案:

答案 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类中的另一个方法相同。我无法弄清楚为什么一个班级有效,另一个班级没有。一旦我在模型中设置自定义类,它们都可以工作。