2010-01-07 26 views
0

好释放被管理对象,请与我的我的情况描述承担:在Objective-C

我有一个核心数据模型(以简化说明)包括GridManager对象。 GridManager拥有一组Grid对象(通过对多关系)。 Grid对象包含一组Cell对象(通过多对多关系)。在我的应用程序中,我有一个包含一系列子视图(CellView类型)的GridView。 GridView具有一个representationGrid属性,CellView具有一个representCell属性(都是非原子的,保留)。在GridView的setRepresentedGrid方法中,我将每个CellView(GridView的子视图)的RepresentCell属性设置为representationGrid中的一个单元格。

现在,我有两个问题:

首先,由于细胞和电网的管理对象,我还需要释放GridView和CellView类的representedGrid和representedCell属性时,他们dealoc?我想我会这样做(就像任何保留的属性一样),但是在某一时刻,我认为这导致了我的应用程序出现问题 - 嗯...只是想,因为我写了自己的setters,而且我实际上并没有保留网格/单元格,也许我不需要释放它们?

其次,一次只有一个来自gridManager的网格处于活动状态。当我将gridView.representedGrid从一个网格切换到另一个网格时,如何“释放”第一个网格(及其关联单元),以便它不会不必要地占用内存(因为我们正在讨论管理对象)。

非常感谢!

+1

你为什么要写自定义的getter和setter? – 2010-01-07 03:27:00

+0

请参阅下面的评论 - 我希望视图在设置了其代表的设置功能时处理某些设置功能 - 我认为需要为某个属性定制设置程序的标准原因。 – FTLPhysicsGuy 2010-01-07 05:19:15

回答

0

是的,您需要在dealloc方法中释放representGrid和representCell属性。如果你没有,保留/释放方法将不会平衡 - 你的setter将保留这个对象,并且没有相应的释放,这个对象将永远不会被释放。

正确写入时,保留设置器将释放其旧值并保留新值。因此,在设置gridView.representedGrid时,不需要释放旧网格。

你为什么写好自己的创作者,出于好奇?

+0

我正在编写自己的setter,以便通过将GridView指向其网格,它会自动设置其CellView子视图来表示网格中的单元格。它还将自己作为观察者添加到来自网格的通知(因此,网格更改时视图可能会更改)。 在一般的编程概念中,属性(而不是直接访问字段)的原因之一是为访问相关属性时提供可执行必要功能的定制getter/setter。当然,我综合了我的绝大多数属性。 – FTLPhysicsGuy 2010-01-07 04:29:12

1

据我所知,你应该避免自定义getter和setter,然后你可以离开核心数据来做它的事情,而不用担心保留/释放。

至于减少内存开销,你可以问核心数据使用这种方法把你对象的错:这里refreshObject:mergeChanges:

退房苹果的文档:http://gemma.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/index.html。这是所有的,希望我能够给你正确的条款寻找。

希望这是一些帮助。

+0

您对refreshObject的评论刷新了我的记忆 - 我现在回想起当我第一次查看Core Data时阅读的内容。谢谢! – FTLPhysicsGuy 2010-01-07 04:57:41

1

如果您的setter保留了托管对象,那么您需要释放它们以匹配保留/释放。但是,根据应用程序的设计方式,您可能不需要保留托管对象。

没有看到所有的代码是难以给出可靠的建议,但你可以用分析仪检查是否有泄漏,使用仪器,以确保你的记忆是不是越来越失控,等等。最后但并非最不重要的你可以关闭保留,将它们切换到分配并查看它是否崩溃。由于NSManagedObjectContext将保留这些对象,因此您的视图根本不需要保留实例。