文档说我不应该在-dealloc中释放任何建模属性。对我来说,这感觉违反了大内存管理规则。我看到标题中有一个很大的保留而且没有发布,因为Core Data似乎在其他任何时候都会这样做。
是否因为Core Data可能会在需要时随时动态删除属性的值?什么是Core Data在删除托管对象时所做的事情?如果没有-dealloc,那么属性如何以及何时被释放?
答案 0 :(得分:1)
Core Data将NSManagedObjects作为其基础对象,它们由系统管理,您不必对它们进行任何内存管理......除非您在未在对象中定义的类中声明自己的属性模型...
答案 1 :(得分:1)
当对象变成故障时,托管对象内存会变得棘手。故障是物体的幽灵。它存在并响应消息,但它没有填充它的属性。例如,即使对象本身是故障,也可以计算多对多关系中的对象数。
故障用于将对象图维护在内存中,而不会产生实际数据的开销。该对象在技术上仍然存在,因此从未调用过dealloc。
当上下文将一个对象变成一个错误时,该对象会释放并在内存中找到它的属性。它在willTurnIntoFault
和didTurnIntoFault
中执行此操作。如果你需要做一些特殊的释放,你应该覆盖那些方法(通常是后者。)
错误使托管对象依赖于与其他类不同的方法进行初始化和清理。您可以在awakeFromInsert
或awakeFromFetch
中进行初始化,然后在willTurnIntoFault
和didTurnIntoFault
中取消注释。
遵循托管对象的规则非常重要,因为上下文可能会在内存中保留数千个出现故障的对象。如果您创建自定义属性但在对象出现故障时不释放它,那么您可能会轻易地占用大量内存。