4

我有两个具有 int64_t 属性的核心数据模型。当我尝试为整数字段分配非零值时,其中一个工作正常,而另一个抛出 EXC_BAD_ACCESS。我已经阅读了重新创建 NSManagedObject 子类的答案,但我没有成功。损坏的类如下所示:

@interface NoteObject : NSManagedObject

@property (nonatomic) int64_t remoteID;
@property (nonatomic) int64_t remoteArticleID;

@property (strong, nonatomic) ArticleObject *article;

@property (strong, nonatomic) NSString *status;
@property (strong, nonatomic) NSString *token;

@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *noteContent;

@property (strong, nonatomic) NSDate *pubDate;
@property (strong, nonatomic) NSDate *modDate;

@end

@implementation NoteObject

@dynamic remoteID;
@dynamic remoteArticleID;

@dynamic article;

@dynamic status;
@dynamic token;

@dynamic title;
@dynamic noteContent;

@dynamic pubDate;
@dynamic modDate;

@end

违规行在此块中:

_noteObject = [NSEntityDescription insertNewObjectForEntityForName:@"Note" inManagedObjectContext:self.managedObjectContext];

_noteObject.remoteArticleID = 0; // this works
_noteObject.remoteArticleID = 1; // this crashes

真正让我难过的是,在另一个模型中,我有相同类型的相同字段,它们会毫无问题地接受非零值:

bookmarkObject = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark" inManagedObjectContext:self.managedObjectContext];

bookmarkObject.remoteArticleID = 0; // this works
bookmarkObject.remoteArticleID = 1; // this works, too

我的 .xcdatamodeld 文件中是否有任何可能导致此问题的内容?

编辑

我的数据模型如下所示:

NoteObject 数据模型 书签对象数据模型

4

3 回答 3

5

我有完全相同的问题。

当您手动编辑 NSManagedObject 中的属性时,xcode(或者编译器,或者它们之间的两者)似乎有时会感到困惑——它最终将我们的整数视为指针并尝试直接访问内存——因此是 EXC_BAD_ACCESS。

无论如何,正如这个问题所解释的那样:SO Question,解决方案是删除您的旧类(显然复制出任何自定义代码,以便您以后可以再次将其粘贴回来),然后让 xcode 为您重新生成它(选择数据中的实体模型并选择“编辑器/创建 NSManagedObject 子类...”)。在出现的对话框中,确保勾选“使用原始数据类型的标量属性”。

您可能必须手动编辑生成的类以将一些非标量属性转换回对象(我有一个日期对象,它变成了 NSDate 以外的东西 - 我忘记了具体是什么,但它接受了手动编辑回 NSDate)。

它对我有用。希望对你有效。

阿里

于 2013-07-11T19:18:14.097 回答
2

好吧,万一其他人遇到这个问题,我从来没有找到一个令人满意的答案来解释为什么一个实体正在工作而另一个实体没有。我的解决方法是重构属性以使用NSNumber包装器而不是原始int64_t值。

@property (strong, nonatomic) NSNumber *remoteID;
@property (strong, nonatomic) NSNumber *remoteArticleID;

当然,这意味着对整数值进行装箱/拆箱。

_noteObject.remoteArticleID = [NSNumber numberWithInt:1];

int intVar = [_noteObject.remoteArticleID intValue];
于 2013-07-01T14:17:01.333 回答
0

在您的模型文件中,检查实体的“类”属性是否设置为适当的类,而不是默认的NSManagedObject.

实体设置

如果您将其保留为NSManagedObject,Core Data 将在它自己生成的自定义子类上自己创建属性NSManagedObject,而不是使用您自己的子类。大多数 getter 和 setter 似乎都可以工作,但您可能会遇到未装箱的原始属性和自定义 getter 和 setter 的问题。

于 2016-05-03T16:12:08.657 回答