NSFetchedResultsController initWithFetchRequest генерирует исключение EXE-BAD-ACCESS - PullRequest
0 голосов
/ 04 февраля 2011

У меня есть NSFetchedResultsController внутри подкласса UITableViewController внутри UINavigationController. Когда я запускаю приложение, все работает отлично, первые три раза я получаю доступ к представлению (переходя к нему, затем нажимая «Назад», затем возвращаясь к нему), но на четвертом (всегда) происходит сбой со следующим: *

-[NSEntityDescription subentitiesByName]: message sent to deallocated instance 0x8b09c80

Любая помощь будет высоко ценится.


Вот мой геттер для контроллера результатов:

- (NSFetchedResultsController*)eventsResultsController {

  if (eventsResultsController_ == nil) {

    NSFetchRequest *aFetchRequest = [[PADataContext sharedInstance] makeGetAllFetchRequestForEntity:@"PAEvent" sortedBy:@"when" ascending:NO];

    // NOTE: crashes on this next line
    NSFetchedResultsController *aFetchedResultsContorller = [[NSFetchedResultsController alloc] initWithFetchRequest:aFetchRequest managedObjectContext:[[PADataContext sharedInstance] managedObjectContext] sectionNameKeyPath:@"whenMonth" cacheName:@"AllEvent"];

    self.eventsResultsController = aFetchedResultsContorller;

    [aFetchedResultsContorller release];

  }

  return eventsResultsController_;

}

Это код, который я использую для создания NSFetchRequest:

- (NSFetchRequest*)makeGetAllFetchRequestForEntity:(NSString*)entityName sortedBy:(NSString*)sortString ascending:(BOOL)ascending {

  NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
  NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:[self managedObjectContext]];
  [fetchRequest setEntity:entity];

  if (sortString != nil) {

    // add sorting information
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortString ascending:ascending];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    [sortDescriptors release];
    [sortDescriptor release];

  }

  [entity release];
  return fetchRequest;

}

Объект контекста создается один раз и сохраняется в течение всего времени жизни приложения в одиночном.

Я проверил, что eventsResultsController_ освобождается, когда контроллер вида получает dealloc ed.

В стеке мне сказали, что он разбился в методе initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:

#0  0x00f04057 in ___forwarding___
#1  0x00f03f22 in __forwarding_prep_0___
#2  0x00da1b4d in -[NSFetchedResultsController initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:]
#3  0x00008c94 in -[PAHistoryListTableView eventsResultsController] at PAHistoryListTableView.m:125
#4  0x00008a5b in -[PAHistoryListTableView loadData] at PAHistoryListTableView.m:52
#5  0x00008a2a in -[PAHistoryListTableView viewDidLoad] at PAHistoryListTableView.m:43
...

1 Ответ

3 голосов
/ 04 февраля 2011

Вы создали свою сущность без удержания вызова:

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:[self managedObjectContext]];

И затем вы выпустили ее:

[entity release];

Уберите релиз.Это тривиально, когда вы сосредотачиваетесь на том факте, что это был NSEntityDescription, который был переиздан.Вы используете это только в одном месте, поэтому легко найти ошибку.

...