PageViewController: как выпустить добавленные в него ViewController?

У меня проблема с новым PageViewController (тот, у которого изящная анимация поворота страницы). Насколько я понимаю, есть стек ViewControllers, который нужно настроить так:

PageView *startingViewController = [self.modelController viewControllerAtIndex:0];
NSArray *viewControllers = [NSArray arrayWithObject:startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];

Все идет нормально. Затем вам нужно настроить источник (ваш контроллер модели). В вашем контроллере модели вам нужно использовать четыре метода:

-(PageView *)viewControllerAtIndex:(NSUInteger)index
-(NSUInteger)indexOfViewController:(PageView *)viewController
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController

Последние два называются, если вы переворачиваете страницу (на следующую или предыдущую). Второй просто определяет номер индекса страницы. Интересный - и тот, где моя проблема - это первый. Первый возвращает ViewController (который в моем примере называется PageView). Это самый конец метода:

PageView *pView = [[PageView alloc] init];
return pView;

Мне интересно, где этот pView заканчивается и как я могу выпустить его? Я думаю, что авто-релиз - плохая идея, так как я не знаю, как долго это нужно. Если он окажется в стеке (что, я думаю, так и будет), как долго это нужно? Конечно, только для следующих нескольких страниц. Например, представьте себе, что вы настраиваете pView для страницы 1. Затем вы переходите на страницы 2 и 3. К тому времени вам больше не нужна страница 1 - вы можете ее отпустить. Если вы вернетесь на страницу 1, она будет перезагружена.

Я поместил команды log в свой pView dealloc, но он никогда не вызывается. Так что я предполагаю, что пропускаю все созданные мной контроллеры viewController.

Есть идеи, как и где выпустить их, когда они больше не нужны?

1 ответ

Решение

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

PageView *pView = [[PageView alloc] init] autorelease];
return pView;

Ваш экземпляр PageView размещается в куче (а не в стеке), и PageViewController будет владеть им и сохранит его, если потребуется его сохранить. Это становится обязанностью PageViewController после того, как ваш метод вернулся.

(В противном случае просто используйте ARC и позвольте компилятору позаботиться об этом)

Другие вопросы по тегам