Iphone 什么';对于这种常见的应用程序模式,什么是有效的CoreData上下文/协调策略?
我有一个常见的应用程序模式:用户在主视图控制器中输入数据,然后在模式视图控制器中的表中查看数据,在该表中可以删除或修改行。我一直在遵循斯坦福iPhone课程中的总体设计策略,但在某些地方,事情偏离了轨道,我得到的只是SIGABRT和例外情况,比如“非法尝试在不同上下文中的对象之间建立关系‘xyz’。” 在斯坦福课程中,我使用了一个名为“Database”的单例类,它应该在任何时候请求时返回相同的上下文。因此,主视图控制器上我的viewDidLoad方法中的第一个命令是:Iphone 什么';对于这种常见的应用程序模式,什么是有效的CoreData上下文/协调策略?,iphone,cocoa-touch,core-data,nsfetchedresultscontroller,nsmanagedobjectcontext,Iphone,Cocoa Touch,Core Data,Nsfetchedresultscontroller,Nsmanagedobjectcontext,我有一个常见的应用程序模式:用户在主视图控制器中输入数据,然后在模式视图控制器中的表中查看数据,在该表中可以删除或修改行。我一直在遵循斯坦福iPhone课程中的总体设计策略,但在某些地方,事情偏离了轨道,我得到的只是SIGABRT和例外情况,比如“非法尝试在不同上下文中的对象之间建立关系‘xyz’。” 在斯坦福课程中,我使用了一个名为“Database”的单例类,它应该在任何时候请求时返回相同的上下文。因此,主视图控制器上我的viewDidLoad方法中的第一个命令是: dbsingleton
dbsingleton = [Database sharedInstance];
nmocontext = [dbsingleton managedObjectContext];
nmocontext是我在整个视图控制器中使用的ivar。当用户希望看到另一个视图控制器和表时,我将其分配给init,然后以模态的方式呈现。(它有一个NSFetchedResultsController,可以从我的商店提供数据。)我在这里尝试了各种策略:
- 我已使NSFetchedResultsController成为主视图控制器设置的保留属性
- 我已使NSManagedObjectContext成为主视图控制器设置的保留属性;及
- 通过在表视图控制器的viewDidLoad方法的开头重复上面的两行代码,我在内部使用了singleton
谢谢大家! 这只是一个猜测,但我假设您在关闭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建议使用依赖项注入来共享上下文。这个问题已经在这里讨论过了:谢谢。我摆脱了单例,并将上下文作为一个属性贯穿始终。这有助于防止运行时崩溃。然而,当我写入缓存时,我不知何故干扰了它——在随后的读取中,我在持久缓存周围得到了一个致命的错误。我想我应该把这篇文章作为一个单独的问题。谢谢