【问题标题】:Core Data: "EXC_BAD_ACCESS" when using plain int data type核心数据:使用纯 int 数据类型时的“EXC_BAD_ACCESS”
【发布时间】:2013-05-15 06:39:31
【问题描述】:

我对在“核心数据”数据管理框架内存储普通的“int”或“short”(int16_t)属性(在我的情况下是 iOS 6)有一些疑问。 我尝试以各种方式使用它,但发现无法做到,并因上述异常而失败。现在,几周后,我在 StackOverflow 中找到了这篇文章,看起来有人就是这样做的:

请参阅以下示例以将枚举存储在“Daniel Eggert”的较低答案中: Best way to implement Enums with Core Data

这里看起来好像他使用了一个普通的“int16_t”并将其映射到数据模型中的一个“核心数据”条目“整数 16”......这真的有效吗?我完全按照说明进行了尝试(即使使用相同的命名 :-)),但由于众所周知的“EXC_BAD_ACCESS”异常而失败......正如预期的那样。

对这个有什么想法吗?我是否误解了链接的答案?

---- 编辑:--- 有趣的是有人如何评价这个问题(甚至正确链接另一个问题),但没有答案?!无论如何:

我现在对 Apple 的“事件”示例应用程序进行了同样的尝试,它可以正常工作。 我自己的测试还是不行。应用程序之间的主要区别:

  • 我的托管类不是自动生成的,我重用了现有的类
  • 我现有的类中仍有一些带有“@synthesize”的属性

我自己的实体(托管对象): h:

@interface TestEntity : NSManagedObject
{
}
@property (nonatomic) int64_t testAttribute;
@end

米:

@dynamic testAttribute;

模型数据类型:“整数 64”。

其他.m:

TestEntity *testEntity = (TestEntity *)[NSEntityDescription insertNewObjectForEntityForName:@"Trip" inManagedObjectContext:[GenericDAO getManagedContext]];
[testEntity setTestAttribute : 4]; //this triggers the exception

【问题讨论】:

  • 你能发布你的代码吗?我已经使用链接中的代码没有问题
  • 这个答案看起来不错,如果它不适合您,请发布一些代码,以便我们了解您是如何实现它的。
  • 是自动生成的代码吗?我猜真正的对象是期待一个 NSNumber...
  • 确实,如果我使用 NSNumber,那么它可以工作。然而,当我使用 Apple 文档随附的原始示例应用程序时,我可以使这样的属性工作......并且链接的文章也表明这应该工作。我想有一个不那么明显的小故障:)。
  • 我没有说你的代码应该可以工作,我说其他答案中的代码可以工作。我还不知道到底有什么不同。对于触发异常的行,您是否收到任何编译器警告?我也怀疑“我重用了现有的课程”。我猜您现有的课程与您的实体不匹配。

标签: ios objective-c cocoa-touch core-data


【解决方案1】:

在上周详细讨论了整个问题后,我发现使用 iOS 6 和最新的 XCode(在我的情况下为 4.6.2)我可以完全按照我的问题中提到的链接中指定的方式执行所有操作。我看到的问题与一组根本没有记录的技术细节有关。我是怎么知道的?我只是执行了以下步骤来验证我的实体:

  • 使用支持 Core Data 的 Xcode 创建一个新的空项目
  • 在 Xcode 中使用“编辑器”菜单项“导入”,打开数据模型(选择要与 Core-Data 一起使用的“XY.xcdatamodeld”。
  • 您将看到模型中导入了哪些项目,以及哪些项目被“错误”指定(通过属性设置或其他方式)
  • 现在只需创建您最初想要编码为原始数据类型的所有属性,并在“编辑器”菜单中选择“导出”菜单项(选择数据模型时!)。小心:选中“创建原始数据类型”复选框以获取基本类型而不是 Cocoa/对象属性。

要检查您的原始项目,请在原始项目中执行此操作,在我的情况下,Core-Data 甚至菜单项看起来都不同(某些选项是灰色的):

  • 在旧的/您的当前项目中执行相同的步骤(将实体导入数据模型)。​​
  • 如果结果不同,这将告诉您您的 项目 设置在某种程度上不兼容/旧,您可以更改项目设置以找出影响核心数据行为的设置。李>
  • 还可以尝试使用导出功能,看看生成的代码是否正确。

其他重要提示:您可以在 Core-Data 数据模型编辑器中选择属性并在项目之间复制/粘贴它们。如果您想迁移一些实体/属性以进行测试,这将非常方便。不要只复制整个“cxdatamodeld”设置文件,它会保留旧项目的设置(我尝试了两次以验证)。

【讨论】:

    【解决方案2】:

    检查您为核心数据模型文件中的所有实体正确设置了名称、类和父实体。检查您的所有类名称是否与您的实体名称匹配。问题的原因是编译模型时没有找到带有setter的头文件。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2019-04-05
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2011-10-11
      相关资源
      最近更新 更多