我正在开发我的第一个核心数据iPhone应用程序。我正在使用导航控制器,根视图控制器显示4行。单击第一行将我带到第二个表视图控制器。但是,当我单击后退按钮时,重复行轻击,再次单击后退按钮,然后第三次点击该行,我收到错误。我已经研究了一个星期而没有成功。
我可以轻松重现错误:
在ListViewController.m中,我添加了#import MyTestAppDelegate.h“和以下代码:
- (void)viewDidLoad {
[super viewDidLoad];
if (managedObjectContext == nil) {
managedObjectContext = [(MyTestAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
..
}
导致错误的顺序是点击行,返回,点击行,返回,点击行 - >错误。 managedObjectContext是第三次合成。感谢您的耐心和帮助,因为这对我来说毫无意义。
ADDENDUM:我可能有部分解决方案。 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 :(得分:0)
我想我有答案。
在默认的Core Data Navigation Controller模板中,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 Controller,并且以下代码用于设置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,由于MOC归AppDelegate所有,因此无效。