Binary Lion Studios

I code for fun and for food.

NSFetchedResultsController crashing

If you are using an NSFetchedResultsController and fetching the data using an NSPredicate, you may have seen this nasty message:

1
2
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** - \
[CALayerArray evaluateWithObject:]: unrecognized selector

In my case, this was due to releasing the NSPredicate object too soon. Simply remove the release message and things will work fine again.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (NSFetchedResultsController *)fetchedResultsController {
  if (fetchedResultsController == nil) {
      NSFetchRequest *request = [[NSFetchRequest alloc] init];
      [request setEntity:[NSEntityDescription entityForName:@"Task" inManagedObjectContext:managedObjectContext]];
      [request setReturnsObjectsAsFaults:NO];
      
      NSPredicate *pred = [NSPredicate predicateWithFormat:@"taskList = %@", taskList];
      [request setPredicate:pred];
      
      NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
      [request setSortDescriptors:[NSArray arrayWithObject:sort]];
      
      NSFetchedResultsController *aFRC = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
      aFRC.delegate = self;
      self.fetchedResultsController = aFRC;
      
      [aFRC release];
      [sort release];
      // [pred release]; don't do this ... shouldn't be releasing it anyway (I didn't allocate the memory for it).
      [request release];
  }
  return fetchedResultsController;
}