- (void)launchSearch
{
EventsSearchViewController *searchController = [[EventsSearchViewController alloc] initWithNibName:@"EventsSearchView" bundle:nil];
[self.navigationController pushViewController:searchController animated:YES];
//[searchController release];
}
Уведомление [searchController release]
закомментировано. Я понял, что нажатие searchController
на контроллер навигации сохраняет его, и я должен отпустить его из моего кода. В конце концов, я просто выделил/запустил его, и если я не освобожу его, он просочится.UINavigationController и управление памятью
С этой строкой прокомментировал, что работа навигации прекрасна. С ним НЕ прокомментировал, я могу перемещаться по этому виду в порядке, но возвращаясь вверх, уровень падает с ошибкой *** -[CFArray release]: message sent to deallocated instance 0x443a9e0
.
Что здесь происходит? Является ли NavigationController выпуском для меня каким-то образом, когда он выходит из поля зрения?
В шаблоне, который поставляется на шаблоне UINavigationController в XCode, вышел новый контроллер. Но когда я это делаю, он терпит неудачу.
--- EDIT ----
Так сегодня утром, сажусь, и она работает. Не знаю, почему. Вздох.
Принимая то, что, как я думал, я узнал и применил его к другой части этого же контроллера, я сделал следующее. Вчера у меня был этот код БЕЗ релизов, потому что с ними не получилось. Так сегодня утром я добавил их создания:
- (IBAction)switchView:(id)sender
{
UISegmentedControl *seg = (UISegmentedControl *)sender;
NSInteger choice = [seg selectedSegmentIndex];
NSArray *array = [mainView subviews];
UIView *oldView = [array objectAtIndex:0];
[oldView removeFromSuperview];
if (choice == 0) {
tableController = [[EventsTableViewController alloc]
initWithNibName:@"EventsTableView" bundle:nil];
[mainView addSubview:tableController.view];
[tableController release];
}
if (choice == 1) {
calendarController = [[EventsCalendarViewController alloc]
initWithNibName:@"EventsCalendarView" bundle:nil];
[mainView addSubview:calendarController.view];
[calendarController release];
}
if (choice == 2) {
mapController = [[EventsMapViewController alloc]
initWithNibName:@"EventsMapView" bundle:nil];
[mainView addSubview:mapController.view];
[mapController release];
}
}
С его настроить так, когда я прихожу на взгляд, главный портал мой взгляд наполнен зрения EventsTableViewController, я могу нажать на MAPview и calendarView , но когда я перехожу на BACK в tableView, я умираю, потому что методы делегирования таблицы вызываются на освобожденном экземпляре.
Итак, я пошел и сделал все эти контроллеры синтезированными свойствами, поэтому я могу их освободить в [dealloc]
. Кажется, что это работает, но реальный вопрос заключается в том, почему добавление этих представлений в качестве подзаголовков не сохраняет их, передавая право собственности на новое представление, в котором оно входит, позволяя мне выпускать их прямо там?
Что произойдет, если вы закомментируете строку pushViewController, но раскомментируете строку выпуска? Сбой в выпуске? – MrHen
Нет. Очевидно, что в пользовательском интерфейсе ничего не происходит, но NSLog сообщает мне, что он подходит к концу этого метода. Но дело не в том, что релиз падает даже тогда, когда его нажимают. Когда я возвращаюсь из поискового контроля, я просто нажал, вот когда я разбился. –
Хорошо, это самое страшное. Сегодня утром это работает. Я оставил нажатие И релиз, и я не могу сделать его сбоем. Итак, я начал смотреть на другие места, на которых я нажимаю контроллеры на навигатор, где я оставил освобождение от них, потому что это не сработало иначе, и когда я добавил их обратно в еще одну странность. Я обновлю этот вопрос с соответствующим кодом. –