有人可以解释在删除对象并保存上下文后指向 NSManagedObjects 的指针会发生什么吗?我应该如何设置它们以便它们自动设置为零?
3 回答
嗯,这很简单。
[managedObjectContext deleteObject:managedObject];
[managedObjectContext save:error];
managedObject = nil;
如果您在删除大量对象时担心内存泄漏,请使用快速枚举。这几乎可以保证自行清理:
for (NSManagedObject *obj in fetchedObjects) {
[managedObjectContext deleteObject:obj];
}
[managedObjectContext save:error];
删除对象后,该isDeleted
属性将为 true。保存上下文后,如果您仍然有对托管对象的引用,则isDeleted
将为false 。
您可以安全地weak
引用托管对象。当weak
Core Data 使用它们时,引用将在 ARC 下自动为您消失。
以下是核心数据编程指南中的三个相关段落:
Core Data“拥有”托管对象的生命周期。使用故障和撤消,您不能对托管对象的生命周期做出与标准 Cocoa 对象相同的假设——托管对象可以根据需要由框架实例化、销毁和复活。
创建托管对象时,将使用托管对象模型中为其实体指定的默认值对其进行初始化。在许多情况下,模型中设置的默认值可能就足够了。但是,有时您可能希望执行额外的初始化——可能使用模型中无法表示的动态值(例如当前日期和时间)。
您通常不应覆盖 dealloc 来清除瞬态属性和其他变量。相反,您应该覆盖 didTurnIntoFault。didTurnIntoFault 由 Core Data 自动调用,当一个对象变成一个错误时,并且在实际释放之前。您可能会专门将托管对象变为故障以减少内存开销(请参阅“减少内存开销”),因此确保在 didTurnIntoFault 中正确执行清理操作非常重要。
我检查(managedObject.managedContext == nil)。如果它是 nil,那么它被删除了。尽管 Apple 文档不能保证这一点,但它似乎对我来说很好。如果你在不同的上下文中使用它或者它没有被保存,它就不会起作用。请参阅如何判断 `NSManagedObject` 是否已被删除?详情。