我有一个NSManagedObject的子类,大多数属性是动态的(由托管对象创建),但我有一些辅助属性,它们被创建为@synthesize。
释放这些物体的正确方法是什么?
- (void)didTurnIntoFault
{
[self.randomVar release];
[super didTurnIntoFault];
}
或
- (void)dealloc
{
[self.randomVar release];
[super dealloc];
}
答案 0 :(得分:11)
覆盖didTurnIntoFault
并在那里发布。管理对象在出现故障时不一定要解除分配。
我们不鼓励您覆盖
dealloc
或finalize
,因为didTurnIntoFault
通常是清除值的更好时间 - 托管对象在转换为一段时间后可能无法回收一个错误。核心数据不保证在所有方案中都会调用dealloc
或finalize
(例如应用程序退出时);因此,您不应该在这些方法中包含所需的副作用(如保存或更改文件系统,用户首选项等)。
答案 1 :(得分:6)
您可能需要仔细查看“核心数据编程指南”。这两个段落特别相关
如果您定义自定义实例 变量,你应该清理这些 而不是didTurnIntoFault中的变量 比dealloc或finalize。
和
您通常不应该覆盖 dealloc或finalize以清除瞬态 属性和其他变量。 相反,你应该覆盖 didTurnIntoFault。
答案 2 :(得分:4)
[这应该是评论,因为我指出了问题的另一个问题,但我想要代码格式化功能]。
永远不要这样做:
[self.randomVar release];
释放由属性支持ivar指向的对象,但不会使指针本身为零。这意味着如果释放导致对象被解除分配,您现在可能会有一个悬空指针。要么这样做:
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之外,第一种形式是首选。