非零整数值的核心数据 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】非零整数值的核心数据 EXC_BAD_ACCESS【英文标题】:Core Data EXC_BAD_ACCESS for non-zero integer values 【发布时间】:2013-06-27 20:13:02 【问题描述】:

我有两个具有 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 的 remoteArticleID 字段的配置与 .xcdatamodeld 文件中的 Bookmark 的配置有什么不同吗? 托管对象子类文件是自己写的还是Xcode生成的? 你应该考虑使用mogenerator来创建你的托管对象类 好的,我已经添加了数据模型编辑器的图像。正如我之前所说,这些类是由 Xcode 生成的。 @Raider:我只是想知道,因为 Xcode 生成的类文件通常有@property (nonatomic, retain),而不是@property (strong, nonatomic) 【参考方案1】:

我遇到了完全相同的问题。

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

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

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

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

阿里

【讨论】:

+1 为现有答案添加了更多上下文。 (您也可以将问题标记为重复)【参考方案2】:

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

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

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

_noteObject.remoteArticleID = [NSNumber numberWithInt:1];

int intVar = [_noteObject.remoteArticleID intValue];

【讨论】:

奇怪,但这东西对我有用。必须有某种方法来直接处理原始数据类型。【参考方案3】:

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

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

【讨论】:

以上是关于非零整数值的核心数据 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

EXC_BAD_ACCESS:核心数据、NSFetchedResultsController 和 numberOfRowsInSection

核心数据:EXC_BAD_ACCESS 访问关系

Index Beyond Bounds / EXC_BAD_ACCESS 核心数据删除 SwiftUI

核心数据 executeFetchRequest 因 exc_bad_access 而失败

EXC_BAD_ACCESS 设置核心数据实体属性

在 mergeChangesFromContextDidSaveNotification 中同步上下文时核心数据崩溃 (EXC_BAD_ACCESS)