NSManagedObject 子类问题

Posted

技术标签:

【中文标题】NSManagedObject 子类问题【英文标题】:NSManagedObject subclass woes 【发布时间】:2010-12-19 09:31:52 【问题描述】:

大家好,我有一个 NSManagedObject 的子类。在 awakeFromInsert 和 awakeFromFetch 中,我调用了一个初始化方法,其中包括启动一个 NSTimer。

现在我需要一个地方来使计时器失效。但是,不会调用 dealloc、finalize、didTurnIntoFault、prepareForDeletion 和 willTurnIntoFault。

根据文档,当对象从内存中清除时,这些方法都应该被调用。它们都不是,但是所有数据都保存在持久存储中。我对为什么或如何感到困惑。

我可以做些什么来导致这些方法在对象生命周期中不被调用?

【问题讨论】:

【参考方案1】:

核心数据控制NSManagedObjects 的生命周期。除非您要求,否则它不会自行从内存中刷新对象。查看documentation,似乎有两种方式:

    向 MOC 发送 refresh:mergeChanges: 会导致对象变成故障。 向 MOC 发送 reset 会导致 MOC 像刚刚创建一样重置自身。

但是,以上任何一项都需要您进行明确的操作,因此您不妨向对象添加一个方法以使其计时器无效并调用它。

事实上,您的问题可能表明存在设计问题。 NSTimer 本质上是一个用户界面事件。它可能应该由您的 MVC 控制器控制,该控制器向模型对象(NSManagedObject)发送消息以执行操作。

【讨论】:

但是当应用程序退出时不应该从内存中刷新对象吗?所以应该调用dealloc、didTurnIntoFault等清理方法……不应该吗?

以上是关于NSManagedObject 子类问题的主要内容,如果未能解决你的问题,请参考以下文章

子类化一个 NSManagedObject 子类

NSManagedObject 子类问题

NSManagedObject 验证和子类

当一对多相关的 NSManagedObject 子类发生更改时,如何更新 NSManagedObject 子类?

NSManagedObject 子类属性

新的 NSManagedObject 子类与新的 NSObject 子类?