我正在尝试遵循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/

10-08 20:58