iPhone NSManagedObject - 正确的释放方式是什么?

7

我有一个NSManagedObject的子类,大部分属性都是动态创建的(由托管对象创建),但我有一些辅助属性是通过@synthesize创建的。

释放这些对象的正确方法是什么?

- (void)didTurnIntoFault
{
     [self.randomVar release];
     [super didTurnIntoFault];
}

或者
- (void)dealloc
{
     [self.randomVar release];
     [super dealloc];
}
3个回答

11

重写didTurnIntoFault并在此处释放它们。当托管对象变为故障时,它们不一定会被解除分配。

根据文档

建议不要重写deallocfinalize,因为didTurnIntoFault通常是清除值的更好时间 - 托管对象可能在转换为故障后有一段时间未被回收。 Core Data不能保证在所有情况下(例如应用程序退出时)都会调用deallocfinalize,因此您不应该在这些方法中包含必需的副作用(例如保存或更改文件系统、用户首选项等)。


1
对于像我这样被override名称搞糊涂的人,FYI:willTurnIntoFault并不表示错误或“故障”,它只是CoreData将对象从循环中取出的术语。 - jpswain

6

您可能需要仔细阅读《Core Data编程指南》。以下两段话尤其相关:

如果您定义了自定义实例变量,应该在didTurnIntoFault中清除这些变量,而不是在dealloc或finalize中。

通常不应覆盖dealloc或finalize以清除瞬态属性和其他变量。相反,您应该覆盖didTurnIntoFault。


4

[其实这应该是一条评论,因为我想指出一个不同于问题的问题,但我需要代码格式化功能].

永远不要这样做:

[self.randomVar release];

这个方法会释放属性后端ivar指向的对象,但不会将指针本身设为nil。这意味着,如果释放导致对象被销毁,则可能存在悬空指针。要避免这种情况,请执行以下操作:

self.randomVar = nil;

或者这个

[randomVar release];  // assumes the property is backed by an ivar of the same name.
randomVar = nil;      // can be omitted if you are in dealloc

第一种形式在dealloc以外的任何地方都是首选。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接