2012-01-06 3 views
0

Я делаю приложение, которое имеет вид с UITableView с UISearchDisplayController. Данные поступают от NSFetchedResultsController. Все работает нормально: я получаю данные, заполняется табличный вид, поиск отлично работает. Единственная проблема заключается в том, что если я нахожу поиск и затем нажимаю «Отмена» (не удаляя текст из UISearchBar), а затем возвращаюсь к предыдущему контроллеру представления, а затем перехожу в тот же вид с UITableView и UISearchDisplayController, он сбрасывается, журнал:Перезагрузка просмотра после поиска приводит к сбою приложения

2012-01-06 16: 46: 37,559 MyApp [9586: 207] *** - [SomeRandomViewController controllerWillChangeContent]: сообщение, отправленное высвобождены например 0x778d060

I 'go googled и stackoverflowed для этой ошибки, попытался освободить переменную NSFetchedResultsController, установил ее и ее' делегат ел до нуля, но ничего не помогает.

И если я сделаю поиск, удалите текст из строки поиска, а затем нажмите «Назад» и вернитесь к этому виду, это работает отлично.

Немного кода:

- (void)viewDidUnload { 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 

    self.fetchedResultsController = nil; 
    self.searchFetchedRC = nil; 
    [super viewDidUnload]; 
} 

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller { 

    self.fetchedResultsController = nil; 
    [self fetchedResultsController]; 
} 

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    self.searchDisplayController.searchBar.text = @""; 
    self.searchDisplayController.active = NO; 
    [self searchDisplayControllerWillEndSearch:self.searchDisplayController]; 
    return YES; 
} 

Любая помощь будет оценена

Update

Без зомби выход к сруба:

2012- 01-09 09: 25: 48.128 Бутан [17325: 207] - [UIText MagnifierTimeWeightedPoint controllerWillChangeContent]: непризнанные селектор направлен например 0x8251dc0

Update метод 2

Dealloc:

- (void)dealloc { 
    [self.mySearchDisplayController release]; 
    self.mySearchDisplayController.delegate = nil; 
    self.mySearchDisplayController = nil; 
    [self.fetchedResultsController release]; 
    self.fetchedResultsController.delegate = nil; 
    self.fetchedResultsController = nil; 
    [self.searchFetchedRC release]; 
    self.searchFetchedRC.delegate = nil; 
    self.searchFetchedRC = nil; 
    [self.tableView release]; 
    [textView release]; 
    self.tableView = nil; 
    self.tableView.delegate = nil; 
    [super dealloc]; 
} 

mySearchDisplayController = UISearchDisplayController 

fetchedResultsController and searchFetchedRC = NSFetchedResultsControllers 

tableView = UITableView 

textView = [HPGrowingTextView][1] 

Update 3

Вдохновленный ответа Тиа I мы установили FRC и их делегатов в. 210. Работает до сих пор так хорошо

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller { 

    self.fetchedResultsController.delegate = nil; 
    self.fetchedResultsController = nil; 
    self.searchFetchedRC.delegate = nil; 
    self.searchFetchedRC = nil; 
    [self fetchedResultsController]; 
} 
+0

[Enable зомби] (http://stackoverflow.com/questions/5386160/how-to-enable-nszombie-in -xcode) и вернуться к нам. – Joe

+0

http://stackoverflow.com/questions/3532861/core-data-app-crashing-with-controllerwillchangecontent-unrecognized-selector не поможет? – tia

+0

@tia спасибо за ссылку, но это не помогает – Novarg

ответ

1
- (void)dealloc { 
    //[self.mySearchDisplayController release]; 
    self.mySearchDisplayController.delegate = nil; 
    self.mySearchDisplayController = nil; 
    //[self.fetchedResultsController release]; 
    self.fetchedResultsController.delegate = nil; 
    self.fetchedResultsController = nil; 
    //[self.searchFetchedRC release]; 
    self.searchFetchedRC.delegate = nil; 
    self.searchFetchedRC = nil; 
    //[self.tableView release]; 
    [textView release]; 
    self.tableView.delegate = nil; 
    self.tableView = nil; 
    [super dealloc]; 
} 

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

+0

Спасибо за ваш ответ, но он все тот же: 2012-01-09 10: 46: 01.154 MyApp [19078: 207] *** - [SomeRandomViewController controllerWillChangeContent :]: сообщение отправлено на освобожденный экземпляр 0x7790820 – Novarg

+0

Вдохновленный вашим ответом, я установил NSFetchedResultsControllers и их делегатов на нуль в методе searchDisplayControllerWillEndSearch. До сих пор он работает. Спасибо за то, что вы натолкнули меня в правильном направлении :) – Novarg

+0

Не стоит беспокоиться, но вы должны действительно изучить документ об управлении памятью, поскольку он принципиально важен для развития iOS. – tia

1

У меня была аналогичная проблема, как мой VC реализован протокол UISearchBarDelegate и searchBarTextDidEndEditing: в настоящее время называется после я уволенного ВК в Tableview: didSelectRowAtIndexPath: метод.

Я установил его с:

self.searchDisplayController.delegate=nil; 
self.searchDisplayController.searchBar.delegate=nil; 

до

[self dismissModalViewControllerAnimated:YES]; 
Смежные вопросы