gpt4 book ai didi

objective-c - OS X Core Data Utility 教程中的崩溃

转载 作者:行者123 更新时间:2023-12-03 17:26:49 26 4
gpt4 key购买 nike

我正在尝试遵循 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,为设置运行对象的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 的默认 int 值 (-1)。

感谢迄今为止的帮助!

最佳答案

如果您在

上获得 EXC_BAD_ACCESS
[run setProcessID:[processInfo processIdentifier]];

这几乎肯定是由于其中一个指针不再指向真实对象。 run 已被解除分配,或者 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com