好的,请留下我对我的情况的描述:
我有一个Core Data模型(在简化描述中)包含一个GridManager对象。 GridManager包含一组Grid对象(通过多对多关系)。 Grid对象包含一组Cell对象(通过多对多关系)。
在我的应用程序中,我有一个包含一系列子视图(类型为CellView)的GridView。 GridView具有representGrid属性,CellView具有representCell属性(均为非原子,保留)。在GridView的setRepresentedGrid方法中,我将每个CellView的表示的Cell属性(GridView的子视图)设置为representGrid中的一个单元格。
现在,我有两个问题:
首先,由于单元格和网格是托管对象,我还需要在它们处理时释放GridView和CellView类的representGrid和representCell属性吗?我想我做(就像任何保留的财产一样),但有一次我认为这导致我的应用程序出现问题 - 嗯...只是想,因为我写了自己的定制者,我实际上并没有保留网格/单元格,也许我不需要释放它们?
其次,gridManager中只有一个网格一次处于活动状态。当我将gridView.representedGrid从一个网格切换到另一个网格时,如何“释放”第一个网格(以及它的关联单元格),以便它不会不必要地占用内存(假设我们正在讨论托管对象)。
非常感谢!
答案 0 :(得分:1)
据我所知,你应该并且可以避免使用自定义getter和setter,然后你可以留下核心数据来做这件事而不用担心保留/释放。
至于减少内存开销,您可以使用以下方法让核心数据将对象变为错误:refreshObject:mergeChanges:
在此处查看Apple文档:http://gemma.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/index.html。它就在那里,希望我已经能够给你正确的术语来寻找。
希望有所帮助。
答案 1 :(得分:1)
如果您的setter保留了托管对象,那么您需要释放它们以匹配保留/释放。但是,您可能不需要保留托管对象,具体取决于应用程序的设计方式。
在没有看到所有代码的情况下,很难提供可靠的建议,但您可以使用分析仪检查泄漏,使用仪器确保您的内存不会失控,等等。最后但并非最不重要的是,您可以关闭保留,切换它们分配并查看它是否崩溃。由于NSManagedObjectContext
将保留对象,因此您的视图很可能根本不需要保留NSManagedObject
个实例。
答案 2 :(得分:0)
是的,您需要在dealloc方法中释放representGrid和representCell属性。如果不这样做,则保留/释放方法将不会平衡 - 您的setter将保留该对象,并且没有相应的释放,该对象将永远不会被释放。
如果写得正确,保留设置器将释放其旧值并保留新值。因此,在设置gridView.representedGrid时无需释放旧网格。
出于好奇,你为什么要写自己的二传手呢?