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