gpt4 book ai didi

ios - 避免在 NSManagedObjectContext 中注册对象堆积(memleak)

转载 作者:技术小花猫 更新时间:2023-10-29 11:02:05 25 4
gpt4 key购买 nike

我有一个内存密集型 iOS 应用程序,我正在努力确保内存使用量不会随着时间的推移而增加。我的应用程序有一个在应用程序的整个生命周期内都存在的“主”上下文,偶尔会为后台任务生成其他较小的上下文。

我注意到的一件事是 NSManagedObjects 似乎长期在主上下文中保持注册状态,真正回收与从数据库中拉出对象相关的所有内存的唯一方法是调用 [NSManagedObjectContext reset]

这当然会导致内存使用量大幅下降,因为最近关闭的 ListView 中的所有已注册对象都会从内存中正确弹出,但是这很烦人,因为您刚刚使在该上下文中注册的每个对象无效,您仍然有一个引用(即由仍然打开的 View 引用的对象),您现在需要从数据库中重新获取所有这些对象以避免访问无效对象的异常。

这是从 NSManagedObjectContext 中清除已注册对象集的唯一方法,还是有更好的方法可以成功弹出您不再引用的所有已注册对象,但不会使所有仍然存在的 NSManagedObjects 无效还活着?

最佳答案

NSManagedObjectContext 有一个内部行缓存,清除它的唯一方法是重置上下文。如果您确实遇到内存问题,一些可能有帮助的事情是:

  • 托管对象保留它们的相关对象。如果您的托管对象 A 被其他托管对象 B 的关系所引用,那么对象 A 将保留在内存中,即使您已经发布了所有对它的引用。它实际上不会被释放,直到对象 B 被释放或重新出错,因为它仍将被 B 保留。
  • 处理此问题(以及其他内存问题)的一种方法是在 MOC 上为您当前未使用的对象调用 refreshObject:mergeChanges:,并将第二个参数设置为 。这会使对象重新出现故障,即使对象返回到初始“故障”状态,卸载其属性值和关系。对于之前的 AB,重新错误 B 将释放与 A 的关系。请记住,这将丢失 B 上所有未保存的更改,因此请确保您已在必要时先保存。
  • 如果您的托管对象包含任何类型的大型二进制数据,请尝试将该数据移至单独的实体或完全移出 Core Data,以避免在不需要时将其加载到内存中。
  • MOC 上的
  • reset 基本上是核心数据内存管理的核心选项。它非常有效,但正如您所发现的那样可能非常危险。最好避免这种情况,除非您尚未使用从 MOC 加载的任何对象。

关于ios - 避免在 NSManagedObjectContext 中注册对象堆积(memleak),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com