gpt4 book ai didi

swift - 即使在取消初始化后内存中的 NSManagedObject

转载 作者:搜寻专家 更新时间:2023-11-01 07:17:08 25 4
gpt4 key购买 nike

我在仪器中注意到,每当我创建一个 NSManagedObject 时,该对象中至少有 1 个会永远保留在内存中。我创建了一个空项目,其中包含 1 个名为“书籍”的实体。

这个实体的类:

class Books: NSManagedObject {

@NSManaged var name: String

convenience init(context: NSManagedObjectContext, name: String) {
let description = NSEntityDescription.entity(forEntityName: "Books", in: context)!
self.init(entity: description, insertInto: context)

self.name = name
}

deinit { print("\(type(of: self)): deinitialized") }
}

当我创建多个 Books 时,仪器会显示多个 Books 实例:

instances

当 View Controller 取消初始化时,我使用以下方法清理上下文:

deinit {
context.registeredObjects.forEach { context.refresh($0, mergeChanges: false) }

print("\(type(of: self)): deinitialized")
}

因此在 View Controller 被取消初始化后,仪器仍然显示 Books 的 1 个对象:

persistent

View Controller 中没有其他内容,日志显示所有实例和 Controller 都已取消初始化。

问题:
如果我创建各种实体的许多实例,那么它们将永远保留在内存中。有没有办法摆脱它,这样我就可以保持内存“干净”?

编辑:
添加了 Visual Memory Debugger 的屏幕截图

Visual Memory Debugger

最佳答案

简短的回答是,refresh 调用与对象是否在内存中无关。该代码实际上对您正在查看的数据没有任何影响。 refresh 调用,带有 mergeChanges:false 表示 Core Data 可以将对象转换回故障。它的属性值和关系可能会从内存中删除,但对象本身仍然存在。

至于为什么内存中仍然只有一个实例,那是因为在某处你有对该对象的引用。不过,分配工具对此无济于事。你最好试试 Xcode 的 memory graph debugger如果你担心的话。不过我建议,除非您的内存情况非常糟糕,否则追踪单个 64 字节分配可能不是高优先级。

关于swift - 即使在取消初始化后内存中的 NSManagedObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41540417/

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