读取特定 NSManagedProperty 后释放 NSManagedObject 时,NSPersistentStoreCoordinator 会抛出 EXC_BAD_ACCESS

2024-01-08

错误描述

我有一个应用程序,其中使用核心数据(由 SQLite 支持)在本地存储一些数据以及以下内容NSManagedObject子类

import CoreData

@objc(ScoutingEventData)
class ScoutingEventData: NSManagedObject {
    @NSManaged var id: String?
    @NSManaged var type: String?
    @NSManaged var entityId: String?
    @NSManaged var oldStateJson: NSData?
    @NSManaged var newStateJson: NSData?
    @NSManaged var eventDate: NSDate?

    func toInsertEvent() throws -> ScoutingEvent.Insert {
        guard let id = id else { fatalError("events should have an event id") }
        guard let data = newStateJson else { fatalError("insert event should have newStateJson stored") }
    
        // If I uncomment this line, the error goes away. 
        // Somehow by ensuring that data never gets deallocated, the error never occurs.
        // globallllll = data
  
        return ScoutingEvent.Insert(id: id, entity: try ScoutingEntity.from(data))
    }
}

// debugging var to prevent data from being deallocated
var globallllll: NSData?

正如上面代码片段中的评论所提到的,如果我允许从newStateJson待解除分配的财产。

我收到的错误来自后台线程:

如果我在诊断工具中启用僵尸,我会得到这个

如果启用了僵尸,我还会在控制台中收到以下消息:

2016-11-18 16:26:13.773 ScoutingData_Example[51750:4716636] *** -[CFData release]:消息发送到释放实例 0x7f8c4eb10ae0

以及以下堆栈跟踪:


到目前为止我尝试过的

我尝试过存储NSManagedObjectContext它用于在静态变量中获取此数据,以确保上下文永远不会被释放,但这没有效果。

我尝试过转换NSData?属性到String?属性,并将数据存储为 Base64 编码字符串而不是二进制数据(并且还更新支持模型),但这也没有任何效果。错误仍然存​​在。

我尝试注释掉读取属性的代码,并且错误消失了,但这显然不是一个可接受的解决方案。

我尝试在读取该值后将其存储在全局变量中,以防止它被释放,并且错误消失,但这也不是有效的解决方案。

我尝试注释掉所有代码uses值,而不是仅将值打印到控制台,并且错误仍然存​​在。这让我相信访问该属性,然后稍后释放它的行为,就是造成此错误的原因。


我很困惑。这看起来真的很奇怪,在读取数据后我对数据做什么应该很重要,而且当后台线程被释放时,后台线程上发生的任何事情似乎都特别奇怪。

更奇怪的是,它似乎是针对这一属性的。例如,我在读取 newDataJson 属性的行正上方读取的 id 属性不会导致任何问题。您可能认为这是不同的,因为 id 是一个字符串,而不是 NSData,但我尝试将 NSData 属性转换为字符串属性,但它仍然没有改变错误。

任何想法将不胜感激。谢谢。

Edit

不确定这是否有帮助,但这是我的模型架构


为该属性指定一个不以以下字符开头的名称new。我也遇到过类似的问题,不得不将我的财产重命名为类似的名称theNewState。我觉得new前缀具有特殊含义,会混淆 ARC 内存管理。

编辑:参考Apple ARC 发行说明 https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html,请参阅“您不能为访问器指定以 new 开头的名称”部分。所以它实际上是访问器/获取器名称,而不是属性名称本身。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取特定 NSManagedProperty 后释放 NSManagedObject 时,NSPersistentStoreCoordinator 会抛出 EXC_BAD_ACCESS 的相关文章

随机推荐

  • 如何将图像放入 AlertDialog 中?安卓

    我不知道如何将图像放入 AlertDialog 中 我有这段代码 但我认为这是不可能的 AlertDialog Builder alert new AlertDialog Builder MessageDemo this ImageView
  • 为新用户授予默认权限或默认组

    默认行为似乎是新用户没有权限 也没有组 然而 我不想手动授予每个新用户基本权限 并且我假设他们不想等我这样做 我应该如何为新用户分配默认权限 已经提出了一些类似的问题 但对于一般情况没有明确的答案 Django默认用户权限 https st
  • @layout 引用的自定义 xml 属性

    我想用自己的 xml 属性创建一个自定义视图 我想指定一个标题布局 该布局将在我的自定义 xml 视图中膨胀 如下所示
  • plotly 3d 表面 - 将立方体更改为矩形空间

    我想要一个不在立方体中的 3D 图 因为我的 z 数据比 x 和 y 轴的比例小 10 倍 如何设置才能使 3D 绘图不是立方体 而是矩形 我希望 x y z 轴也具有相同的比例 也就是说 在此示例中 x 和 y 的范围是从 0 到 100
  • 如何以编程方式获取 aws ebs 定价?

    是否可以以编程方式下载 aws ebs 定价 我能够下载整个 AWS 服务索引文件 但没有看到列出的 Amazon EBS 我下载了 AmazonEC2 定价信息 它有 PricePerUnit 对于 EC2 实例来说意味着 但没有专门显示
  • pickle pandas DataFrame 的最快方法是什么?

    使用 Pandas 内置方法或pickle dump 标准的pickle方法如下所示 pickle dump my dataframe open test pickle p wb Pandas 内置方法如下所示 my dataframe t
  • 如何修改预构建的 Python 安装以在另一个目录中工作?

    对于预构建的自定义 Python 发行版的项目 我需要能够使用以下命令从源代码编译包pip 在已安装的环境中 最终产品的两次安装的文件系统结构可能如下所示 opt my program v1 some files custom python
  • Perl 程序用空格替换制表符

    我想编写一个 Perl 单行代码 用空格替换当前目录中一批文本文件中的所有制表符 t 而不影响可见间距 谁能告诉我如何做到这一点 这是在FAQ http perldoc perl org perlfaq4 html How do I exp
  • 是否可以创建动态嵌入功能?

    是否可以在ActionScript3中创建动态嵌入功能 例如像这样 public function embedImage path String Bitmap Embed source path mimeType image png var
  • .NET 相当于旧的 vb left(string, length) 函数

    作为一名非 NET 程序员 我正在寻找旧 Visual Basic 函数的 NET 等效项left string length 它很懒 因为它适用于任何长度的字符串 正如预期的那样 left foobar 3 foo 同时 最有帮助的是 l
  • 创建一个大的位域?

    我想在 JavaScript 中创建一个大的位字段 它将有效地表示多维标记数组 使用索引跳转到物理 1D 结构中的各个维度 我正在考虑如何将字符串用作位 而不是一堆数字 这样我就可以首先分配适当长度的字符串 数据类型 Unicode 和转换
  • 在地图上显示用户位置 SwiftUI

    我正在尝试加载地图并在用户位置上显示初始位置 并使用 SwiftUI 在地图上显示用户的位置 我不知道如何在 SwiftUI 中做到这一点 我尝试将 view showsUserLocation true 放入 updateUIView 函
  • TypedValue 转换为字符串

    当我使用 Android 应用程序时 LogCat 中随机出现了数十次重复的以下 5 行内容 10 26 12 53 30 372 21270 21270 W Resources Converting to string TypedValu
  • 在 Visual Studio 加载项中 - 如何检索文本选择对象的属性 (Visual Commander)

    我为此绞尽脑汁了一天多 本质上 我正在尝试构建一个用于 Visual Studio 2012 的加载项 该加载项执行以下操作 获取当前选择的变量名称 找到它作为实例的类 然后在其自己的行中为每个属性键入 veriable property
  • Flash 加载两次的解决方法?

    在调查我的网站加载缓慢的报告问题时 我遇到了一个问题 我注意到 通过 firebug 我的 Flash 文件加载了两次 经过一番调查后 我找到了一个火狐错误 https bugzilla mozilla org show bug cgi i
  • Rails 3.2 asset_host 设置被忽略

    我的生产环境 Code is not reloaded between requests config cache classes true config assets enabled true Full error reports are
  • 在被杀死的字符上方创建 GUI 文本

    我正在制作一个自上而下的 2D 游戏 我不知道如何在角色死亡时将文本放置在角色上方 我创建了一个带有空游戏对象的预制件 其中有GUIText附加到它的组件 当我的对象死亡时 我需要在它上面创建预制对象 当对象死亡时 预制件会在正确的位置创建
  • 程序程序员的功能代码片段列表? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何处理 fork-join-queue 中的最终一致性

    我目前正在寻找替换以下视频中描述的 fork join queue 的有缺陷的实现 https youtu be zSDC TU7rtc t 33m37s https youtu be zSDC TU7rtc t 33m37s 我意识到这个
  • 读取特定 NSManagedProperty 后释放 NSManagedObject 时,NSPersistentStoreCoordinator 会抛出 EXC_BAD_ACCESS

    错误描述 我有一个应用程序 其中使用核心数据 由 SQLite 支持 在本地存储一些数据以及以下内容NSManagedObject子类 import CoreData objc ScoutingEventData class Scoutin