Сбой Autorelease после закрытия контроллера модального представления

Я представляю табличное представление в модальном контроллере представления, созданном с помощью следующего кода (http://stackoverflow.com/questions/4471289/how-to-filter-nsfetchedresultscontroller-coredata-with-uisearchdisplaycontroll), поэтому я могу использовать Core Data, NSFetchedResults и UISearchbar. Наконец-то у меня все хорошо работает в табличном представлении/поиске/подробном представлении, но я только что обнаружил демонстрацию, которую, похоже, не могу понять.

Когда я отклоняю табличное представление, используя:

  - (IBAction)doneButtonPressed:(id)sender {[self dismissModalViewControllerAnimated:YES];}

модальное представление закрывается, загружается основное представление, а затем приложение аварийно завершает работу. Это заходит достаточно далеко, чтобы я мог вызвать этот nslog из основного контроллера представления:

-(void) viewDidAppear:(BOOL)animated { NSLog(@"do I crash");}

Я получаю ошибку плохого доступа здесь:

   int main(int argc, char *argv[]) 
   {
       @autoreleasepool {
         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));}}

Я считаю, что проблемы могут быть связаны между собой. Шаблон кода, который я использовал, не был предназначен для дуги, поэтому я внес следующие изменения:

    @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
    @property (nonatomic, retain, readonly) NSFetchedResultsController *fetchedResultsController;

to

    @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
    @property (nonatomic, strong, readonly) NSFetchedResultsController *fetchedResultsController;

    @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
    @property (nonatomic, retain) NSFetchedResultsController *searchFetchedResultsController;
    @property (nonatomic, retain) UISearchDisplayController *mySearchDisplayController;

to

    @property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
    @property (nonatomic, strong) NSFetchedResultsController *searchFetchedResultsController;
    @property (nonatomic, strong) UISearchDisplayController *mySearchDisplayController;

Кроме того, я удалил следующее из didreceivememorywarning:

   [fetchedResultsController_ release];
   [searchFetchedResultsController_ release];

и изменил следующее в - (NSFetchedResultsController *)fetchedResultsController

    return [[fetchedResultsController_ retain] autorelease];

to

    return fetchedResultsController;

а в - (NSFetchedResultsController *)searchFetchedResultsController

    return [[searchFetchedResultsController_ retain] autorelease];

to

    return searchFetchedResultsController;

Я совершенно озадачен. Будем очень благодарны любой помощи!


person Zachary Fisher    schedule 02.06.2012    source источник
comment
хорошо, странная дополнительная информация... Если я активирую поиск, а затем отменю поиск (мне даже не нужно ничего вводить), приложение закроет контроллер модального представления без сбоя. Если я не использую панель поиска, она вылетает в 100% случаев. Ясно, что при активации поиска что-то устанавливается, что устраняет проблему с пулом автоматического выпуска, но я не могу понять, что это такое!   -  person Zachary Fisher    schedule 02.06.2012
comment
Кроме того, когда я запускаю инструмент зомби, он вообще не падает (даже без предварительной активации поиска)   -  person Zachary Fisher    schedule 02.06.2012
comment
Итак, после небольшого исследования зомби, мне интересно, не является ли это ошибкой выпуска (включенный nszombie ничего не регистрирует в отладчике). Возможно, это проблема с повреждением памяти. Я до сих пор не уверен, как начать решать....   -  person Zachary Fisher    schedule 02.06.2012


Ответы (1)


Что ж, проблема решена. Я не могу представить, что я первый или последний, кто столкнулся с этой проблемой, поэтому, если у вас возникнут аналогичные трудности....

Изучив код поиска (я решил, что это как-то связано с этим, поскольку, если бы я искал до того, как закрыл модальное окно, он не рухнул бы), я так и не смог найти ничего неправильного.

Однако я понял, что создавал и searchBar, и searchDisplayDelegate программно. По прихоти я решил создать searchBar и displayDelegate в раскадровке, а затем связать их. Как только они были добавлены, я прокомментировал их из loadView:

//  UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 44.0)];
//   self.mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];

Кроме того, добавление их в раскадровку автоматически создало следующее в viewDidUnload:

[self setSearchBar:nil];
[self setMySearchDisplayController:nil];

Виола! Больше никаких сбоев... Я думаю, это просто mySearchDisplayController не выгружался должным образом. Надеюсь, это поможет другим!

person Zachary Fisher    schedule 03.06.2012