Iphone 什么';对于这种常见的应用程序模式,什么是有效的CoreData上下文/协调策略?

Iphone 什么';对于这种常见的应用程序模式,什么是有效的CoreData上下文/协调策略?,iphone,cocoa-touch,core-data,nsfetchedresultscontroller,nsmanagedobjectcontext,Iphone,Cocoa Touch,Core Data,Nsfetchedresultscontroller,Nsmanagedobjectcontext,我有一个常见的应用程序模式:用户在主视图控制器中输入数据,然后在模式视图控制器中的表中查看数据,在该表中可以删除或修改行。我一直在遵循斯坦福iPhone课程中的总体设计策略,但在某些地方,事情偏离了轨道,我得到的只是SIGABRT和例外情况,比如“非法尝试在不同上下文中的对象之间建立关系‘xyz’。” 在斯坦福课程中,我使用了一个名为“Database”的单例类,它应该在任何时候请求时返回相同的上下文。因此,主视图控制器上我的viewDidLoad方法中的第一个命令是: dbsingleton

我有一个常见的应用程序模式:用户在主视图控制器中输入数据,然后在模式视图控制器中的表中查看数据,在该表中可以删除或修改行。我一直在遵循斯坦福iPhone课程中的总体设计策略,但在某些地方,事情偏离了轨道,我得到的只是SIGABRT和例外情况,比如“非法尝试在不同上下文中的对象之间建立关系‘xyz’。”

在斯坦福课程中,我使用了一个名为“Database”的单例类,它应该在任何时候请求时返回相同的上下文。因此,主视图控制器上我的viewDidLoad方法中的第一个命令是:

 dbsingleton = [Database sharedInstance];
 nmocontext = [dbsingleton managedObjectContext];
nmocontext是我在整个视图控制器中使用的ivar。当用户希望看到另一个视图控制器和表时,我将其分配给init,然后以模态的方式呈现。(它有一个NSFetchedResultsController,可以从我的商店提供数据。)我在这里尝试了各种策略:

  • 我已使NSFetchedResultsController成为主视图控制器设置的保留属性
  • 我已使NSManagedObjectContext成为主视图控制器设置的保留属性;及
  • 通过在表视图控制器的viewDidLoad方法的开头重复上面的两行代码,我在内部使用了singleton
无论我使用哪种方法,我都无法解决的一个问题是,在用户关闭并解除分配表视图控制器(及其NSFetchedResultsController)后,当访问存储时,我开始在主视图控制器中崩溃(如上面提到的“非法尝试”错误)

处理这种常见应用程序模式的最佳实践是什么?我仍然希望使此应用程序与iPhone SDK 3.x兼容,但在使用iOS 4时,我的崩溃似乎较少——如果3.x存在导致我出现问题的潜在问题,请告诉我,我可能只针对iOS 4


谢谢大家!

这只是一个猜测,但我假设您在关闭tableview后崩溃时会出现以下问题:

你申报了财产

@property (retain, nonatomic) NSManagedObjectContext* nmocontext;
您是否在dealloc中正确释放ivar nmocontext? 如果是,你的问题是作业

nmocontext = [dbsingleton managedObjectContext];
这不会在viewcontroller中保留nmocontext,而是在dealloc上释放它

第二:

“非法尝试在不同上下文中的对象之间建立关系'xyz'


这不是内存管理问题,但您可能创建了另一个新的上下文来添加对象(如apple core data iphone示例中的对象),并尝试将NSManagedObject设置为不同上下文中的关系。

听起来您的单例配置不正确

singleton应该重写
release
,不执行任何操作,以便在发送release消息时不会发生任何事情。如果你不重写
release
,那么应用程序中任何地方的任意一段代码都可能杀死singleton并破坏使用singleton的全部目的。下次调用singleton时,实际上会得到另一个新对象,在本例中,该对象还返回一个新的托管对象上下文


单身汉功能强大且灵活,但很容易出错。它们很容易出错,以至于许多有经验的开发人员干脆拒绝使用它们。如果你没有使用它们的经验,不要在刚开始的时候使用它们

这是有帮助的。。。删除发布消息有助于iOS 4.0模拟器,但我的3.x测试设备仍会崩溃。我查看了你的个人资料,你看起来对CoreData很有天赋——你对这类应用的总体策略是什么?我想知道我是否把singleton类的事情复杂化了?当您需要从不同的视图控制器访问相同的CoreData存储时,创建上下文和FetchedResultsController的最佳方法是什么?Marcus s.Zarra建议使用依赖项注入来共享上下文。这个问题已经在这里讨论过了:谢谢。我摆脱了单例,并将上下文作为一个属性贯穿始终。这有助于防止运行时崩溃。然而,当我写入缓存时,我不知何故干扰了它——在随后的读取中,我在持久缓存周围得到了一个致命的错误。我想我应该把这篇文章作为一个单独的问题。谢谢