I’m getting a crash with this error message: 2012-01-14 15:09:36.667 [8274:15203] *** -[ExerciseHistoryDetailViewController controllerWillChangeContent:]: message sent to deallocated instance 0x8d0e1f0
Here is the code. Any idea what’s causing this?
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.historyTableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.historyTableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.historyTableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.historyTableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.historyTableView endUpdates];
}
Edit, I got the app to crash again with the same workflow but the debug output is slightly different.
This time error is : 2012-01-14 17:35:48.793 [9012:15203] *** -[DetailViewController controllerWillChangeContent:]: message sent to deallocated instance 0x7fb6100
This is the line it crashed at: (![managedObjectContext save:&error])
This is the method:
-(IBAction)createSet
{
Set *set = (Set *)[NSEntityDescription insertNewObjectForEntityForName:@"Set" inManagedObjectContext:managedObjectContext];
[self.exercise addSetsObject:set];
NSError *error = nil;
if (![managedObjectContext save:&error])
{
// Handle the error.
}
NSLog(@"error: %@", error);
[self checkIfEmpty];
self.fetchedResultsController = nil;
[setsTableView reloadData];
}
In this kind of situation, the fastest way to track down the culprit is to enable NSZombies. Read here how to do it. With zombies enabled, your program should halt on the exact line causing the crash.
I have found a nice tutorial on how to debug memory problems on iOS here.