Iphone 如何在第二视图控制器上显示核心数据?

Iphone 如何在第二视图控制器上显示核心数据?,iphone,xcode,core-data,Iphone,Xcode,Core Data,我正在开发我的第一个核心数据iPhone应用程序。我使用的是导航控制器,根视图控制器显示4行。单击第一行将转到第二个表视图控制器。但是,当我单击“上一步”按钮,重复“行”点击,再次单击“上一步”按钮,并第三次点击该行时,我会得到一个错误。我已经研究了一周,但没有成功 我可以很容易地重现错误: 创建一个新的基于导航的应用程序,将核心数据用于存储,称之为MyTest,它创建MyTestAppDelegate和RootViewController 使用UITableViewController和xib

我正在开发我的第一个核心数据iPhone应用程序。我使用的是导航控制器,根视图控制器显示4行。单击第一行将转到第二个表视图控制器。但是,当我单击“上一步”按钮,重复“行”点击,再次单击“上一步”按钮,并第三次点击该行时,我会得到一个错误。我已经研究了一周,但没有成功

我可以很容易地重现错误:

  • 创建一个新的基于导航的应用程序,将核心数据用于存储,称之为MyTest,它创建MyTestAppDelegate和RootViewController
  • 使用UITableViewController和xib添加新的UIViewController子类,称之为ListViewController
  • 将代码从RootViewController.h和.m复制到ListViewController.h和.m,适当地更改文件名。为了简化代码,我从所有变量中删除了尾随的“\u1”
  • 在RootViewController中,我添加了#import ListViewController.h,设置一个数组以显示4行,并在单击第一行时导航到ListViewController
  • 在ListViewController.m中,我添加了#import MyTestAppDelegate.h“和以下代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
     if (managedObjectContext == nil) {
            managedObjectContext = [(MyTestAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
     }
        ..
    }
    
    @interface PractitionerAppDelegate : NSObject <UIApplicationDelegate> {
    
        UIWindow *window;
        UINavigationController *navigationController;
    
    @private
        NSManagedObjectContext *managedObjectContext_;
        NSManagedObjectModel *managedObjectModel_;
        NSPersistentStoreCoordinator *persistentStoreCoordinator_;
    }
    
    @property (nonatomic, retain) IBOutlet UIWindow *window;
    @property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
    
    @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
    @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
    @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
    
    - (NSString *)applicationDocumentsDirectory;
    
    @end
    
    导致错误的顺序是点击行、返回、点击行、返回、点击行->错误。managedObjectContext是第三次合成。我感谢你的耐心和帮助,因为这对我来说毫无意义

    附录:我可能有一个部分解决方案

    如果我不释放.m文件中的managedObjectContext,错误就会消失。这样行吗?还是会给我带来麻烦

     - (void)dealloc {
        [fetchedResultsController release];
        // [managedObjectContext release];
        [super dealloc];
    }
    

    附录2:见下面的解决方案。很抱歉出现格式问题-这是我的第一篇帖子。

    我想我已经找到了答案

    在默认的Core Data Navigation Controller模板中,AppDelegate执行以下操作:

    - (void)awakeFromNib {    
        RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
        rootViewController.managedObjectContext = self.managedObjectContext;
    }
    
    并且RootViewController具有以下代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
     if (managedObjectContext == nil) {
            managedObjectContext = [(MyTestAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
     }
        ..
    }
    
    @interface PractitionerAppDelegate : NSObject <UIApplicationDelegate> {
    
        UIWindow *window;
        UINavigationController *navigationController;
    
    @private
        NSManagedObjectContext *managedObjectContext_;
        NSManagedObjectModel *managedObjectModel_;
        NSPersistentStoreCoordinator *persistentStoreCoordinator_;
    }
    
    @property (nonatomic, retain) IBOutlet UIWindow *window;
    @property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
    
    @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
    @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
    @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
    
    - (NSString *)applicationDocumentsDirectory;
    
    @end
    
    换句话说,当managedObjectContext由代码设置时(如上所述或在tableView:didSelectRowatineXpath中),则需要释放它

    另一方面,如果managedObjectContext未直接传递给视图控制器,并且以下代码用于设置managedObjectContext

    if (managedObjectContext_ == nil) {
            managedObjectContext_ = [(PractitionerAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
        }
    
    。。。然后不应释放managedObjectContext

    这里有一个简短得多的答案。显然,即使MOC是在视图控制器中分配的,这也没有效果,因为MOC是由AppDelegate拥有的