2010-06-07 39 views
1

就核心数据而言,瞬态属性是“受管理属性”?核心数据是否也管理它的内存?或者我必须在-dealloc中手动释放?我认为不,因为我可能会选择不创建一个子类 - 但是当我有一个瞬态属性时,我想它是没有意义的,因为我需要一个子类来计算这个派生值---不然,或者不是??)我必须在-dealloc中释放瞬态属性吗?

回答

2

核心数据中的内存管理有点棘手。

如果您对瞬态属性没有做任何特殊处理,那么在大多数情况下,合成访问器将为您管理属性的对象生命周期。 (当Xcode从数据模型中为一个托管对象类生成源代码时,它不会为该属性的对象创建一个最终版本,如果它总是必要的话,那就太麻烦了)。不幸的是,你经常做一些特殊的事情一个瞬态属性,所以你需要释放它或任何其他在这个过程中创建的对象。

但是,您不会在dealloc中发布。 Apple文档强烈建议您永远不要修改NSManagedObject子类的init或dealloc。相反,要发布瞬态属性,您需要将发行版放在didTurnIntoFault中。这是因为,当Core Data将对象转换为故障时,即使对象仍驻留在内存中并且存活,它也会清除其所有属性。

因为核心数据在幕后发生的事情非常多,所以在发送最终版本之前检查瞬态属性的对象不是零是非常重要的。

+0

因此,即使我会在-didTurnIntoFault中释放瞬态属性,我也必须检查if(transientProperty!= nil){[transientProperty release]}?但是:发送 - 释放到零不是一个问题,但....或是吗? – dontWatchMyProfile 2010-06-07 17:18:31

+0

理论上不,在现实中,我发现核心数据中有一些奇怪的问题,检查nil似乎避免。你可能会忽略这一点。它更多的是我的腰带和吊带姿态。 – TechZen 2010-06-07 21:10:49

2

如果您的托管对象随时分配任何特殊的内容来支持您的瞬态属性,那么您应该在dealloc中释放它。基本上,发布你创建的任何东西。

+1

你在这里有一个重大的错误。使用托管对象,您不会在dealloc中释放,而是使用'didTurnIntoFault'。 – TechZen 2010-06-07 16:55:28

相关问题