核心数据:NSObjectID 和 NSTemporaryObjectID 泄漏

2023-12-27

在将我的应用程序发送到应用程序商店之前,我喜欢使用工具检查它是否存在内存泄漏和其他可疑内容。有一个核心数据问题我似乎无法解决,因此我决定创建一个小型测试应用程序来说明该问题。

有什么问题?

当我将实体保存在(子)NSManagedObjectContext 中时,它会传播到其父 NSManagedObjectContext。在此过程中,Core Data 创建了以下对象的内部实例:_NSObjectID and NSTemporaryObjectID。由于某种原因,这些实例被留下,摆脱它们的唯一方法是重置父 NSManagedObjectContext。

我的应用程序当然比这个小测试应用程序复杂得多,并且重置 NSManagedObjectContext 对我来说不是一个选择。

Test app

测试应用程序是一个基于单视图模板的标准 iOS 应用程序,并选中了 CoreData 选项。我使用 Objective-C 来使其与我的生产应用程序相似。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Initialize the Core Data stack
    self.persistentStoreCoordinator = [self persistentStoreCoordinator];

    // Create the a private context
    self.rootContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    self.rootContext.persistentStoreCoordinator = self.persistentStoreCoordinator;

    // Create a child context
    self.childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    self.childContext.parentContext = self.rootContext;

    // Create a person
    [self.childContext performBlockAndWait:^{
        Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.childContext];
        person.name = @"John Smith";
        person.age = 30;

        // Save the person
        [self.childContext save:nil];

        // Save the root context
        [self.rootContext performBlockAndWait:^{
            [self.rootContext save:nil];
        }];
    }];

    return YES;
}

当您使用工具和分配工具运行上面的代码时,您可以看到核心数据留下了一些东西。

您可以在这里找到完整的项目:https://github.com/Zyphrax/CoreDataLeak https://github.com/Zyphrax/CoreDataLeak

我尝试过的事情

我尝试过类似的事情[context refreshObject:... mergeChanges:YES],添加@autoreleasepool and/or [context processPendingChanges]在街区内,这一切都没有帮助。让它干净的唯一方法是做一个[context reset](大锤方法)。

很难找到其他人报告此问题。 这篇博文看起来很相似:
http://finalize.com/2013/01/04/core-data-issues-with-memory-allocation/ http://finalize.com/2013/01/04/core-data-issues-with-memory-allocation/

我希望你们能帮我解决这个问题。


这是我所看到的,与你的非常相似......

然而,我不知道我会担心,除非你看到很多这样的东西,而且它们永远不会消失。我假设核心数据的内部(包括行缓存)正在进行某种对象缓存。

另一方面,在过去的一两年里,我的核心数据使用情况发生了一些变化。

除非它是一个非常简单的应用程序,否则我几乎从不在子上下文中创建新对象。我将获取并修改它们,但如果我最终创建一个新对象,我会确保这是在同级上下文中完成的。

但是,如果您稍微修改代码,通过添加此行(使用适当的错误处理 - 它会返回BOOL)在初始保存之前...

NSArray *inserted = self.childContext.insertedObjects.allObjects;
[self.childContext obtainPermanentIDsForObjects:inserted error:&error];

你应该得到类似这个仪器报告的东西,它显示所有创建的对象是瞬态的......

因此,我不一定认为这是永久泄漏,因为一旦我强制上下文转换为永久 ID,对象就会消失。然而,谁知道他们将这些对象 ID 对象缓存多久。

一般来说,当我在包含层次结构的上下文中创建对象时,我总是会首先获取永久 ID(出于多种原因)。然而,正如我之前所说,我通常在直接创建到持久存储的上下文中创建新对象(因为我必须处理与层次结构临时对象 ID 相关的其他问题,特别是在使用多个非相关上下文时)。

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

核心数据:NSObjectID 和 NSTemporaryObjectID 泄漏 的相关文章

  • 核心数据二进制数据允许外部存储崩溃

    我在 iOS 12 0 1 上发生崩溃 日志如下 ImageIO CFDataGetBytes data 0x28539b2f0 size 154262 offset 8 count 8 dst 0x16dbf86f0 External d
  • 如何在 Cocoa with Core Data 中上传和存储文件?

    我有一个应用程序 我希望能够将文件上传到其中 我可以想象序列化数据 将其放入数组中 然后序列化数组并将其放入核心数据中 但这似乎不太正确 我还可以想象将文件复制到应用程序的支持文件中 获取这些文件的 NSURL 并存储数组或 NSURL 无
  • NSPredicate 查询不包含特定字符串

    对这个问题进行了高低查找 但找不到我的答案 我正在查询核心数据以查找不等于指定字符串的所有记录 例如 所有不等于当前会话ID的记录 我已经尝试过这些但无济于事 NSPredicate predicate NSPredicate predic
  • ios 8 核心数据崩溃

    保存时 CoreData 发生崩溃 2014 09 16 09 51 58 273 My app 2678 105246 Terminating app due to uncaught exception NSInvalidArgument
  • 为什么永久代空间不断增长?

    我读过几篇文章 我理解以下内容 如果我错了 请纠正我和 或编辑问题 java堆是这样分段的 年轻代 创建的对象放在这里 这部分被频繁且廉价地垃圾收集 老一代 在年轻代的垃圾收集中幸存下来的对象会移到此处 该区域的垃圾收集频率较低 并且使用对
  • php/symfony/doctrine 内存泄漏?

    我在使用 symfony 1 4 和原则 1 2 将对象批量插入数据库时 遇到问题 我的模型有一种称为 Sector 的对象 每个对象都有多个 Cupo 类型的对象 通常范围从 50 到 200000 这些物体非常小 只是一个短标识符字符串
  • iCloud 超时。 (使用iCloud + Core Data + Magical Record

    我开始了一个应用程序测试来使用Core Data and iCloud 使用魔法记录 经历了一番配置之后Provisioning Profiles和权利 应用程序终于运行了 一段时间后 应用程序崩溃并抛出此消息 2012 12 31 03
  • 如何查找 Java 应用程序中的内存泄漏

    这是我上一个问题的后续问题HERE https stackoverflow com questions 55427497 我在我的 Java 应用程序中目睹了内存泄漏 最初 我认为泄漏来自我的应用程序的服务器组件 但根据其他人的建议 事实并
  • SpeechSynthesizer 中的持续内存泄漏

    我开发了一个项目 我想发布它使用 c WPF 和 System Speech Synthesizer 对象 阻止该项目发布的问题是 每当调用 SpeakAsync 时 都会留下内存泄漏 并最终导致失败 我相信在使用这个物体后我已经正确清理了
  • 检查 coredata 对象是否为零

    我想找出核心数据中的对象 我的代码 Types signedDate Date alarmDate Date starTime 国家标准日期 endTime NSDate NSString str signedDate gt AND sig
  • 如何提高 iPhone 上的核心数据获取性能?

    Core data在iPhone上的表现绝对是惨不忍睹 索引是完全损坏还是只是一个糟糕的实现 我的核心数据存储 SQLite 后备存储 中有大约 21500 个单一类型的对象 这些对象在 UUID 上建立索引 该 UUID 是一个 NSSt
  • SwiftUI NavigationLink 内存泄漏

    我有一个关于内存管理在 SwiftUI 的 NavigationView 堆栈中如何工作的问题 我有一个视图 其中声明了 NavigationView 和 NavigationLink NavigationLink 的目标参数内是我的 Te
  • 内存泄漏随着 T4CPreparedStatement 的增加

    我们有一个使用 hibernate 4 2 22 JBoss 6 4 7 的应用程序 在我们的代码中 我们不使用任何PreparedStatements 每个数据库问题都由hibernate处理 但在性能测试期间我们得到了 oom 其原因似
  • 为什么以及如何避免事件处理程序内存泄漏?

    通过阅读 StackOverflow 上的一些问题和答案 我刚刚意识到 使用以下命令添加事件处理程序 在 C 或者我猜 其他 net 语言 中可能会导致常见的内存泄漏 我过去多次使用过这样的事件处理程序 但从未意识到它们可能会导致或已经导致
  • 举例说明为什么不建议将图像存储在 CoreData 中?

    这个问题已经被问过很多次了 我读到很多用户都说不建议将图像存储在数据库中 特别是在 CoreData 中 他们似乎都忽略了他们这样做的原因 甚至苹果文档也声明了这一点 每个人都指向那个方向 每次讨论都以这样的方式结束 好吧 你可以 但存储路
  • 在 Swift 中,当使用“[weak self] in”时,当嵌套在另一个闭包中时我是否应该加倍它[重复]

    这个问题在这里已经有答案了 在 Swift 中 当使用 weak self in 当嵌套在另一个闭包中时 我应该将其加倍吗 Example override func viewDidLoad super viewDidLoad makeAP
  • 如何在 Eclipse 中保存堆(转储到文件)?

    当我从 MyEclipse 运行或调试 GA AI 时 出现此错误 线程 main 中的异常 java lang OutOfMemoryError Java 堆空间 eclipse ini 看起来像这样 showsplash com gen
  • 从一个 NSManagedObjectContext 保存的更改不会反映在主 NSManagedObjectContext 上

    我有一个主NSManagedObjectContext是在appDelegate 现在 我正在使用另一个NSManagedObjectContext用于编辑 添加新对象而不影响主对象NSManagedObjectContext 直到我拯救它
  • Java:BufferedReader 在 close() 上永远挂起,并且 StreamDecoder 不尊重线程中断

    我有一个 Java 程序 它启动一个由 Process 类表示的单独子进程 然后附加查看 Process 的 stdout stderr 的侦听器 在某些情况下 进程将挂起并停止取得进展 此时 TimeLimiter 将抛出 Timeout
  • PS幸存者空间几乎已满

    我看到我的应用程序的 PS 幸存者空间在大部分时间几乎已满 98 我不知道PS幸存者空间是什么 这是正常的吗 遇到这种情况应该怎么办 首先 参见例如这里 什么是幸存者空间 https stackoverflow com q 10695298

随机推荐

  • SQL内联if语句类型问题

    我想做一个 MS SQL 查询 返回如下内容 Col1 Col2 Col3 AAA 18 92 18 92 BBB 20 00 40 00 AAA 30 84 30 84 BBB 06 00 12 00 AAA 30 84 30 84 AA
  • 在服务器端java类中读取客户端时区

    我有一个客户端程序 它将时间发送到服务器端程序 我正在使用 Callendar 对象将时间值从客户端传递到服务器 我的客户端程序位于斯里兰卡 服务器位于英国 当我在客户端发送时间 例如 2011 11 21T12 43 41 352 05
  • 如何读取UTF-8的InputStream?

    欢迎大家 我正在开发一个 Java 应用程序 它从互联网调用 PHP 它给我一个 XML 响应 响应中包含这个词 Pr ximo 但是当我解析 XML 的节点并将响应获取到字符串变量中时 我收到这样的词 Pr ximo 我确信问题是我在 J
  • 如何绑定到“MvxLinearLayout”的“ItemClick”?

    我有一个ScrollView最初包裹着两个MvxListView控制 Having ListView控制在一个ScrollView不过 Android 不支持 这是有道理的 因为它们都尝试填充父高度并提供自己的滚动逻辑 我想要的是两个不可滚
  • 使用核心数据实现枚举的最佳方法

    将核心数据实体绑定到枚举值以便我能够为实体分配类型属性的最佳方法是什么 换句话说 我有一个名为Item与itemType我想要绑定到枚举的属性 最好的方法是什么 如果您想将值限制为枚举 则必须创建自定义访问器 因此 首先您需要声明一个枚举
  • 在 C++ 中使用友元函数

    刚刚阅读了有关友元函数的内容 我正在尝试使用 B 类中的友元函数 Print 访问 A 类中的私有变量 number 我正在使用 Visual Studio 我的代码的编译给了我很多不同的错误 例如 C2011 A class 类型重新定义
  • 无法访问作业跟踪器的 hadoop web ui [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 在 javascript 的 google 地图 api 中显示楼层选择器

    当使用 Android 或 iOS 版 Google 地图 API 时 似乎默认启用室内地图 并且当您放大具有室内地图的建筑物时 楼层选择器 控件会自动出现 如何在 Google Maps API for javascript 中获得类似的
  • 使用 ServiceStack.ORMLite 的存储库模式中的事务

    我正在使用 ServiceStack ORMLite 实现存储库模式 如下所示 public class MyRepository IMyRepository private IDbConnectionFactory DbConnectio
  • 为什么矢量化失败?

    我想使用优化我的矢量化代码 msse2 ftree vectorizer verbose 2 我有以下简单的代码 int main int a 2048 b 2048 c 2048 int i for i 0 i lt 2048 i b i
  • 是否有符合 W3C CR(显示:flex 等)的当前 CSS 灵活框布局模块的 Polyfill? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Flexiejs com http flexiejs com 具有用于 CSS Flex 框的浏览器
  • 为什么 SELECT * 被认为是有害的?

    Why is SELECT 不好的做法 如果您添加了所需的新列 这不是意味着要更改的代码会更少吗 我明白那个SELECT COUNT 在某些数据库上是一个性能问题 但是如果您真的想要每一列怎么办 其实主要有以下三个原因 将数据传输给消费者的
  • 在sequelize.js 中使用构建方法时是否需要验证、清理或转义数据

    我有一个节点 快速 续集应用程序 我正在使用sequelize 中的build 方法来创建我的foo 模型的实例 Foo控制器 exports create function req res var foo db Foo build req
  • 使用 jasypt 和 encrypt.sh 我的密码如何包含特殊字符?

    尝试使用 encrypt sh 实用程序 但我的密码包含特殊字符 加密 sh 输入 密码 your jasypt password 算法 PBEWITHSHA256AND128BITAES CBC BC keyObtentionIterat
  • 当工作进程死亡时,数据持久化,如何?

    我的工作进程需要收集 计算的数据作为启动时的参数 重新启动时也需要这样做 初始化代码应该放在哪里 在supervisors init里面 或者在模块内部 start link 或 init Erlang 在这方面有什么最佳实践吗 如果 ge
  • DBeaver 和 PostgreSQL 中的串行数据类型问题

    我是新用户 菜鸟 Dbeaver https dbeaver jkiss org 社区版 和PostgreSQL https www postgresql org 我在定义时遇到了很大的麻烦自动递增主键在任何表中 所以我想知道如何能够使用定
  • 如何在具有多个服务器的 NodeJS 中检索 SessionID?

    我是 NodeJS 新手 我正在开发 REST API 并使用 Express Session 来处理会话 因此 要获取我正在使用的会话 ID var sessionID req sessionID 这个sessionID是从服务器端生成的
  • Android - Parcel:无法编组值

    我正在尝试使用 Parcelable 通过活动传递数据 这是我的代码 public class Player implements Parcelable public static final Parcelable Creator
  • 从网络发送短信(是否有一些提供商可以提供此服务)?

    我想要一些类似于 app net 网站的东西 您单击一个按钮 然后可以选择通过短信 或电子邮件 将链接发送到您的手机 实现短信方面有哪些选项 是否有提供此功能的服务或开源包 这是来自 app net 的随机示例 http app net q
  • 核心数据:NSObjectID 和 NSTemporaryObjectID 泄漏

    在将我的应用程序发送到应用程序商店之前 我喜欢使用工具检查它是否存在内存泄漏和其他可疑内容 有一个核心数据问题我似乎无法解决 因此我决定创建一个小型测试应用程序来说明该问题 有什么问题 当我将实体保存在 子 NSManagedObjectC