У меня есть два контроллера табличного представления, показывающих объекты CoreData.Один - подробный вид (с предложениями), другой - обзор (с историями).Pick a Story -> См. Предложения.
Похоже, я перевыпустил свой managedObjectContext;Первоначально я выпустил его в обоих TableViewControllers в dealloc и получал сбой каждый третий раз, когда переходил между двумя контроллерами (Story -> Sentence -> Story -> Sentence -> Story -> Crash).Некоторая отладка показала, что после моего кода в ViewDidLoad обоих TableViewControllers произошел сбой в моем делегате приложения:
if (managedObjectContext == nil)
{
managedObjectContext = [(StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSLog(@"After managedObjectContext: %@", managedObjectContext);
}
Еще одно исследование нашло это обсуждение , которое заставило меня поверить, что этоболее освобожденный ManagedObjectContext:
Вторая более прозаическая проблема - просто переизданный NSManagedObject.Инструменты Инструмент ObjectAlloc должен быть в состоянии помочь вам.
Поэтому я удалил [managedObjectContext release];из моего dealloc в TableViewController, и теперь у меня нет утечек (в соответствии с инструментами) и нет сбоя.
Похоже, проблема решена, но вот вопрос:
Я мог бы вообще упустить момент и просто скрыть другую проблему.Как я могу найти перевыпуск или реальную проблему?
Если я исправлю проблему, я хотел бы знать, почему она исправлена и почему мне не нужноосвободить MOC во втором TableViewController
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];
}