代码之家  ›  专栏  ›  技术社区  ›  ed94133

对于这个常见的应用程序模式,什么是有效的coredata上下文/协调策略?

  •  0
  • ed94133  · 技术社区  · 14 年前

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

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

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

    nmocontext是我在整个视图控制器中使用的一个ivar。当用户想看到另一个视图控制器时,我用表alloc init它,然后以模态的方式显示它。(它有一个从我的商店提供数据的nsfetchedresultscontroller。)我在这里尝试了各种策略:

    • 我已使nsfetchedresultsController成为主视图控制器设置的保留属性
    • 我已将nsmanagedObjectContext设置为主视图控制器设置的保留属性;并且
    • 我在内部使用了singleton,在表视图控制器的viewdidload方法的开头重复上面的两行代码。

    无论使用哪种方法,我都无法解决的一个问题是,当用户关闭并释放表视图控制器(及其nsfetchedResultsController)后,当访问存储时,我开始在主视图控制器中崩溃(如上面提到的“非法尝试”错误)。

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

    谢谢您!

    2 回复  |  直到 14 年前
        1
  •  0
  •   Martin Brugger    14 年前

    这只是一个猜测,但对于关闭TableView后的崩溃,我假设存在以下问题:

    你申报了财产

    @property (retain, nonatomic) NSManagedObjectContext* nmocontext;
    

    您是否在dealloc中正确地释放了ivar nmocontext? 如果是,你的问题是任务

    nmocontext = [dbsingleton managedObjectContext];
    

    这不会在ViewController中保留nmocontext,但会在dealoc上释放它。

    第二:

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

    这不是内存管理问题,但您可能创建了另一个新的上下文来添加对象(如在Apple核心数据iPhone示例中),并尝试将nsManagedObject设置为来自不同上下文的关系。

        2
  •  0
  •   TechZen    14 年前

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

    单例应重写 release 什么都不做,当它被发送一条发布消息时,什么也不会发生。如果不重写 释放 然后,应用程序中任何一段随机的代码都可能杀死单例,并破坏使用单例的整个目的。下次调用singleton时,实际上会得到另一个新对象,在本例中,它还返回一个新的托管对象上下文。

    Cocoa Fundamentals Guide: Creating a Singleton Instance .

    单件是强大和灵活的,但很容易做错。它们很容易搞砸,以至于许多有经验的开发人员都拒绝使用它们。如果你对它们没有经验,就不要在刚开始的时候使用它们。