- (void)launchSearch
{
EventsSearchViewController *searchController = [[EventsSearchViewController alloc] initWithNibName:@"EventsSearchView" bundle:nil];
[self.navigationController pushViewController:searchController animated:YES];
//[searchController release];
}
Обратите внимание, что [searchController release]
закомментировано. Я понял, что нажатие searchController
на контроллер навигации сохраняет его, и я должен освободить его из своего кода. В конце концов, я просто выделил / инициализировал его, и если я его не освобожу, он протечет.
С этой закомментированной строкой навигация работает отлично. Не закомментировав его, я могу нормально перейти к этому представлению, но при возврате вверх уровень падает с ошибкой *** -[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, но когда я возвращаюсь назад к tableView, я умираю, потому что методы делегата таблицы вызываются на освобожденном экземпляре.
Итак, я пошел и превратил все эти контроллеры в синтезированные свойства, чтобы я мог выпустить их в [dealloc]
. Кажется, это работает, но реальный вопрос заключается в том, почему добавление этих представлений в качестве подпредставлений не сохраняет их, передавая владение новому представлению, членом которого он является, и позволяя мне сразу же выпустить их?