Я пытаюсь создать переход между двумя представлениями, используя их контроллеры.Проблема в том, как избавиться от старого контроллера после завершения анимации перехода?Я не могу избавиться от него до завершения анимации, так как это приводит к ошибке сегментации - очевидно, что задействованные анимации не увеличивают счетчик сохранности для представлений, с которыми они работают.
Единственное, о чем я могу думать, этопредоставить метод, который будет вызван после завершения анимации для освобождения аргумента контроллера.Я надеюсь, что у кого-то будет более элегантное решение.
Вот мой пример кода для метода в моем контроллере корневого представления:
-(void) switchToController:(UIViewController *) controller {
[controller viewWillAppear:YES];
if (self.currentScreenController != nil) {
[self.currentScreenController viewWillDisappear:YES];
[[self.currentScreenController view] removeFromSuperview];
}
[self.view addSubview:[controller view]];
if (self.currentScreenController != nil) {
[self.currentScreenController viewDidDisappear:YES];
}
self.currentScreenController = controller;
[controller viewDidAppear:YES];
//[controller release]; // <- releasing now will cause errors as subsequent animations reference this controller's view
...
// animations start now
[Edit] Ну, я не могу показатьсяполучить разрешение на освобождение контроллера даже после окончания анимации по какой-то необъяснимой причине.Я планирую вызов NSTimer через несколько секунд после завершения анимации, проверяю, что счетчик сохранения равен 1, прежде чем выпускать, а затем, когда я его отпускаю, у меня происходит сбой.Вот метод, который вызывается таймером для освобождения уже неиспользуемых контроллеров:
- (void) releaseOldController {
@synchronized(arrayOfOldControllers) {
if (2 < [arrayOfOldControllers count]) {
NSObject * object = [arrayOfOldControllers objectAtIndex:0];
[arrayOfOldControllers removeObjectAtIndex:0];
NSLog(@"releasing object (%@) with retain count(%d)", object, [object retainCount]);
[object release];
}
}
}
Возможно, моя стратегия неверна.То, что я пытаюсь сделать, это смоделировать перелистывание страниц книги.В книге более 30 страниц, я хочу избавиться от старой страницы, как только переход к новой странице закончится, чтобы освободить память.Поэтому, когда пользователь переходит на новую страницу, создается новый контроллер с новым видом и добавляется к корневому контроллеру с переходом анимации замирания примерно в 1/2 секунды.Как только анимация закончится, я хочу освободить предыдущий просмотр страницы, так как виден только новый просмотр страницы.Таким образом, представление корневого контроллера одновременно может содержать не более 2 подпредставлений и, как правило, только 1 - текущую страницу, просмотренную после завершения перехода.Это не должно быть так сложно сделать, но я не понимаю, почему я получаю сообщение об ошибке при освобождении контроллера, когда он больше не используется.
[Обновление] Этот вопрос неправильный - проблема в том, чтогде-то еще и не имеет ничего общего с контроллером или представлением.Код выше правильный.