我有两个显示 CoreData 对象的表视图控制器。一种是详细视图(带句子),一种是概述(带故事)。
选择一个故事 -> 查看句子。
看来我过度释放了管理对象上下文;我最初在 dealloc 的两个 TableViewController 中发布了它,并且每三次在两个控制器之间切换时都会发生崩溃(故事 -> 句子 -> 故事 -> 句子 -> 故事 -> 崩溃)。
一些调试显示,在两个 TableViewController 的 ViewDidLoad 中的此代码之后,我的应用程序委托崩溃了:
if (managedObjectContext == nil)
{
managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After managedObjectContext: %@", managedObjectContext);
}
更多研究发现这次讨论 http://www.cocoabuilder.com/archive/cocoa/242639-core-data-crash-on-moc-release.html这让我相信这是一个过度释放的 ManagedObjectContext 的情况:
第二个更平淡的问题只是过度发布
NSManagedObject。 Instruments ObjectAlloc 工具应该能够提供帮助
你。
所以我删除了 [managementObjectContext release];从 TableViewController 中的 dealloc 中,现在我没有泄漏(根据 Instruments),也没有崩溃。
看起来问题已经解决了,但问题是:
MakeSentenceTableViewController.m
@implementation MakeSentenceTableViewController
@synthesize story, managedObjectContext;
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"My Story";
NSLog(@"Passed Story Object: %@", story);
if (managedObjectContext == nil)
{
NSLog(@"managedObjectContext == nil");
managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After managedObjectContext: %@", managedObjectContext);
}else{
NSLog(@"managedObjectContext != nil");
}
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sentence" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
//sorting stuff:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order" ascending: YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
//[request setFetchBatchSize:FETCH_BATCH_SIZE];
[sortDescriptors release];
[sortDescriptor release];
fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request managedObjectContext:managedObjectContext
sectionNameKeyPath:nil cacheName:nil];
[request release];
NSError *error;
[fetchedResultsController performFetch:&error];
NSLog(@"FetchedResultsController: %@", fetchedResultsController);
NSLog(@"fetchedResultsController RetainCount at viewDidLoad: %d", [fetchedResultsController retainCount]);
}
//snip...table view bits
- (void)dealloc {
[fetchedResultsController release];
//Why don't I have to release this?
//[managedObjectContext release];
[super dealloc];
}