2010-10-05 47 views
0

我正在研究我的第一个核心数据iPhone应用程序。我正在使用导航控制器,并且根视图控制器显示4行。点击第一行将我带到第二个表视图控制器。但是,当我单击后退按钮时,重复行按,再次单击后退按钮,然后再次点击该行,出现错误。我一直在研究这一个星期没有成功。如何在第二个视图控制器上显示核心数据?

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

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

在ListViewController.m,我添加#进口MyTestAppDelegate.h”和下面的代码:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

if (managedObjectContext == nil) { 
     managedObjectContext = [(MyTestAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
} 
    .. 
} 

导致该错误的顺序是抽头行,返回,抽头行,返回,抽头行 - >错误。 managedObjectContext被第三次合成。我感谢你的耐心和你的帮助,因为这对我来说毫无意义。

附录:我可能有一个部分解决方案。 http://www.iphonedevsdk.com/forum/iphone-sdk-development/41688-accessing-app-delegates-managed-object-context.html

如果我不在.m文件中释放managedObjectContext,则错误消失。这是好的还是会导致我的问题?

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

附录2:请参阅下面的解决方案。对格式问题抱歉 - 这是我的第一篇文章。

回答

0

我想我有答案。

在默认的核心数据导航控制器模板,在AppDelegate中执行以下操作:

- (void)awakeFromNib {  
    RootViewController *rootViewController = (RootViewController *)[navigationController topViewController]; 
    rootViewController.managedObjectContext = self.managedObjectContext; 
} 

和RootViewController的具有下面的代码:

@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 

- (void)dealloc { 

    [managedObjectContext_ release]; 
    [managedObjectModel_ release]; 
    [persistentStoreCoordinator_ release]; 

    [navigationController release]; 
    [window release]; 
    [super dealloc]; 
} 

在换句话说,当managedObjectContext被代码设置时,或者是abov e或在tableView:didSelectRowAtIndexPath中,则需要将其解除分配。

在另一方面,如果managedObjectContext没有传递到视图控制器直接,下面的代码被用于设置managedObjectContext ...

if (managedObjectContext_ == nil) { 
     managedObjectContext_ = [(PractitionerAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    } 

...那么managedObjectContext不应该释放。

答案要简短得多。 http://stackoverflow.com/questions/4028797/why-dont-i-have-to-release-managedobjectcontext-in-the-2nd-tableviewcontroller显然,即使MOC是在View Controller中分配的,由于MOC属于AppDelegate,所以它不起作用。

相关问题