0

我有一个共同的应用程序模式:用户在主视图控制器中输入数据,然后在模式视图控制器中的表中查看它,其中可以删除或修改行。我一直遵循斯坦福iPhone课程的总体设计策略,但在某些地方出现了问题,我得到的是SIGABRT的例外情况,例如“非法尝试在不同背景下的对象之间建立关系”xyz“。对于这种常见的应用程序模式,有效的CoreData上下文/协调器策略是什么?

正如在斯坦福大学课程中,我使用了一个叫做“数据库”的单例类,它应该在请求时返回相同的上下文。因此,在主视图控制器在我viewDidLoad方法的第一个命令是:

dbsingleton = [Database sharedInstance]; 
nmocontext = [dbsingleton managedObjectContext]; 

nmocontext是伊娃我整个视图控制器使用。当用户想要查看其他视图控制器时,使用该表,我alloc-init它,然后以模态方式呈现它。 (它有一个从我的店里提供数据的NSFetchedResultsController)。我在这里已经尝试了各种策略:

  • 我做了一个NSFetchedResultsController保留的财产由主视图控制器
  • 我所做的设置NSManagedObjectContext是由主视图控制器设置的保留属性;和
  • 我已经在表单视图控制器的viewDidLoad方法的开始重复上面的两行代码内部使用单例。

无论我去时,一个问题,我只是不能解决的是,在用户关闭后deallocs表视图控制器(及其NSFetchedResultsController),我开始越来越在主视图控制器崩溃时商店被访问(如上面提到的“非法尝试”错误)。

处理这种常见应用程序模式的最佳做法是什么?我仍然希望使这个应用程序与iPhone SDK 3.x兼容,但是当我使用iOS 4时,似乎碰到的崩溃更少 - 如果3.x的底层问题导致了我的问题,请让我知道,我可能只针对iOS 4。

谢谢!

回答

0

这只是一个猜测,但我关闭tableview中后承担的崩溃以下问题:

你声明的属性

@property (retain, nonatomic) NSManagedObjectContext* nmocontext; 

你正确释放的dealloc伊娃nmocontext? 如果是你的问题是分配

nmocontext = [dbsingleton managedObjectContext]; 

这永远保留你的视图控制器内nmocontext但你释放它的dealloc上。

二:

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

这不是一个内存管理问题,但你可能创造另一个新的上下文(苹果核心数据iphone样本等)添加对象,并试图建立一个NSManagedObject从不同的上下文关系。

+0

这是有帮助的......删除发布消息有助于iOS 4.0模拟器,但我仍然在我的3.x测试设备上发生崩溃。我检查了你的个人资料,你看起来对CoreData非常出色 - 你对这类应用的整体策略是什么?我想知道如果我是单身课程过于复杂的事情?当您需要从不同的视图控制器访问相同的CoreData存储时,创建上下文和FetchedResultsControllers的最佳方法是什么? – ed94133 2010-09-13 04:18:58

+0

Marcus S. Zarra建议依赖注入来共享上下文。这个问题已经在这里讨论过了:http://stackoverflow.com/questions/3174610/passing-managedobjectcontext-along-to-view-controller-hierarchy – 2010-09-13 05:11:01

+0

谢谢。我摆脱了这个单身人士,并将整个背景作为一个属性传递给我。这有助于防止运行时崩溃。但是,当我写入缓存时,我会以某种方式干扰它 - 在随后的阅读中,我在持久缓存周围发生致命错误。我想我应该把这个职位作为一个单独的问题。谢谢。 – ed94133 2010-09-15 03:20:37

0

这听起来像你没有正确配置你的单身人士。

单身人士应该重写release什么也不做,这样当发送释放消息时什么都不会发生。如果您不覆盖release,那么应用程序中任何位置的任何随机代码都可能会杀死单例并破坏使用单例的全部目的。当你下次调用singleton时,你实际上会得到另一个新对象,在这种情况下,它也会返回一个新的托管对象上下文。

请参阅Cocoa Fundamentals Guide: Creating a Singleton Instance

单身人士是强大而灵活的,但很容易做错。他们很容易搞砸,许多有经验的开发人员拒绝使用它们。如果没有与他们的经验,不要使用他们,当你刚刚开始。

相关问题