iphone NSManagedObject - 解除分配的正确方法?

时间:2011-01-05 02:28:33

标签: ios objective-c cocoa-touch core-data nsmanagedobject

我有一个NSManagedObject的子类,大多数属性是动态的(由托管对象创建),但我有一些辅助属性,它们被创建为@synthesize。

释放这些物体的正确方法是什么?

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

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

3 个答案:

答案 0 :(得分:11)

覆盖didTurnIntoFault并在那里发布。管理对象在出现故障时不一定要解除分配。

来自documentation

  

我们不鼓励您覆盖deallocfinalize,因为didTurnIntoFault通常是清除值的更好时间 - 托管对象在转换为一段时间后可能无法回收一个错误。核心数据不保证在所有方案中都会调用deallocfinalize(例如应用程序退出时);因此,您不应该在这些方法中包含所需的副作用(如保存或更改文件系统,用户首选项等)。

答案 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之外,第一种形式是首选。