UIPageViewController内存泄漏

Jay*_*hao 9 memory-leaks uipageviewcontroller

似乎UIPageViewController永远保存着初始内容视图控制器.例如:

DataViewController *startingViewController = [self.modelController viewControllerAtIndex:0 storyboard:self.storyboard];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];
self.pageViewController.dataSource = self.modelController;
Run Code Online (Sandbox Code Playgroud)

startingViewController永远不会释放,直到pageViewController它本身释放.

要重现此错误,只需使用基于页面的应用程序模板在XCode中创建一个新项目.并在DataViewController.m中添加3行代码

@property NSInteger debugIndex; // file scope
NSLog(@"DataViewController[%d] created", self.debugIndex); // in viewDidLoad
NSLog(@"DataViewController[%d] dealloc", self.debugIndex); // in dealloc
Run Code Online (Sandbox Code Playgroud)

当您以垂直方向滚动演示应用程序时,您将获得如下日志:

DataViewController[0] created  
DataViewController[1] created  
DataViewController[2] created  
DataViewController[1] dealloc  
DataViewController[3] created  
DataViewController[2] dealloc  
DataViewController[4] created  
DataViewController[3] dealloc  
DataViewController[5] created  
DataViewController[4] dealloc  
DataViewController[6] created  
DataViewController[5] dealloc  
Run Code Online (Sandbox Code Playgroud)

DataViewController [0]永远不会被释放.

有关于此的任何想法?谢谢!

mwu*_*mwu 5

您正在使用transitionStyle UIPageViewControllerTransitionStyleScroll吗?我遇到了相同或相似的问题,当改用页面卷曲动画时,该问题似乎消失了。

这个问题对我来说更加复杂,因为我允许UISliderBar设置内容中的位置。因此,在更改UISliderBar时,我正在调用setViewControllers:direction:animated:completion :,这导致越来越多的视图控制器引用在我的UIPageViewController中“卡住”。

我也在使用ARC。我还没有找到一种强迫UIPageViewController放开多余的视图控制器引用的可接受方法。我可能要么使用页面卷曲过渡,要么使用启用了页面调度的UIScrollView来实现自己的UIPageViewController等效项,这样我就可以管理自己的视图控制器缓存,而不必依赖UIPageViewController损坏的视图控制器管理。


小智 -1

我遇到了同样的问题并解决了以下问题:

[startingViewController release];初始化的终点在哪里。

那么第一个 ViewController 将被释放。