PageViewController: как выпустить добавленные в него ViewController? - PullRequest
3 голосов
/ 29 октября 2011

У меня проблема с новым 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, она будет перезагружена.

Я поместил команды журнала в мой пакет pView, но он никогда не вызывается. Поэтому я предполагаю, что я пропускаю все созданные мной контроллеры view.

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

1 Ответ

3 голосов
/ 29 октября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...