我正在开发我的第一个核心数据iPhone应用程序。我使用的是导航控制器,根视图控制器显示4行。单击第一行将我转到第二个表视图控制器。但是,当我单击后退按钮,重复行点击,再次单击后退按钮,第三次点击行时,我会得到一个错误。我已经研究了一个星期,但没有成功。
我可以很容易地再现错误:
创建一个新的基于导航的应用程序,使用核心数据进行存储,将其称为创建RootViewController.
在ListViewController.m中,我添加了#import 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
如果我不在managedObjectContext文件中释放.m,错误就会消失。这样可以吗?那会引起我的麻烦吗?
- (void)dealloc {
[fetchedResultsController release];
// [managedObjectContext release];
[super dealloc];
}增编2:见下文的解决办法。抱歉,格式化问题-这是我的第一篇文章。
发布于 2010-10-05 23:05:38
我想我有答案了。
在默认的核心数据导航控制器模板中,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由代码设置时,无论是在上面还是在tableView: didSelectRowAtIndexPath中,它都需要被解除分配。
另一方面,如果managedObjectContext没有直接传递给View,并且使用下面的代码设置managedObjectContext.
if (managedObjectContext_ == nil) {
managedObjectContext_ = [(PractitionerAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}..。那么managedObjectContext就不应该发布了。
答案要短得多。显然,尽管MOC是在View中分配的,但这没有任何效果,因为MOC是由http://stackoverflow.com/questions/4028797/why-dont-i-have-to-release-managedobjectcontext-in-the-2nd-tableviewcontroller拥有的。
https://stackoverflow.com/questions/3860827
复制相似问题