PageViewController:如何释放添加到它的ViewControllers?

时间:2011-10-28 20:07:45

标签: iphone objective-c cocoa-touch uiviewcontroller ios5

我遇到了新的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最终会在哪里以及如何释放它?我想autorelease是一个坏主意,因为我不知道它需要多长时间。如果它最终进入堆栈(我猜它确实如此),需要多长时间?当然只是为了接下来的几页。例如,想象一下为第1页设置pView。然后转到第2页和第3页。到那时你不再需要第1页了 - 你可以释放它。如果你回到第1页,它将被重新加载。

我将log命令放在我的pView dealloc中,但它永远不会被调用。所以我想我正在泄漏我创建的每个viewControllers。

任何想法,如果不再需要它们将如何以及在何处释放它们?

1 个答案:

答案 0 :(得分:3)

autorelease 正好您需要什么。这是设计autorelease的完美情况,即您需要返回一个对象,但不知道需要多长时间。

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

您的PageView实例是在堆(而不是堆栈)上分配的,而PageViewController将获取它的所有权并在需要保留它时保留它。在方法返回后,它将成为PageViewController的责任。

(否则只需使用ARC并让编译器处理它)