UIPageViewController内存泄漏

时间:2013-03-01 11:07:27

标签: 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;

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

当你以垂直方向滚动演示应用程序时,你会得到这样的日志:

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  

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

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

5 个答案:

答案 0 :(得分:4)

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

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

我也在使用ARC。我还没有找到一种可以接受的方法来强制UIPageViewController放弃额外的视图控制器引用。我可能最终会使用页面卷曲转换或使用启用了分页的UIScrollView实现我自己的UIPageViewController等效项,这样我就可以管理自己的视图控制器缓存,而不是依赖于UIPageViewController的破坏的视图控制器管理。

答案 1 :(得分:3)

我不确定你是否还有这个问题,但我遇到了同样的问题,我找到了解决方案。

我不知道原因,但确实有效。

我正在addSubview之后设置第一个viewController,而不是addChlidViewController之前。

-(void)settingPageViewController{
if (!self.pageViewController) {
    self.pageViewController = [[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
    self.pageViewController.delegate = self;
    self.pageViewController.dataSource = self;
    [self addChildViewController:self.pageViewController];
    [self.pageViewController didMoveToParentViewController:self];
    [self.containerView addSubview:self.pageViewController.view];
    [self.pageViewController setViewControllers:@[[self viewcontrollerAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}    
}

并且第一个viewController将在正确的时间内释放。

另外,我发现如果打电话

        [self.pageViewController setViewControllers:@[[self viewcontrollerAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:^(BOOL finished){
        NSLog(@"finished : %d",finished);
    }];
addSubView之前

并且完成块不会调用。

我认为这个块是第一个viewController没有dealloc的原因。

我会去找出它没有回调的原因,并改进答案〜

欢呼声

答案 2 :(得分:1)

在尝试弄清楚在类似问题上发生了什么之后,我注意到在我的项目中有2个原因导致了保留问题并导致UIPageViewController永远保留。

1)UIPageViewController与呈现的UIViewcontroller之间存在循环引用(这是通过在两个类中将属性更改为弱而修复的)

2)主要修正包括改变

One.init(one:)

[self setViewControllers:@[initialDetailsViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

我希望这有助于某人

答案 3 :(得分:0)

这里的问题相同 我通过将我的初始viewController保存在变量中来解决它 而不是在特定的pageIndex上创建相同的vc我只是重用它

答案 4 :(得分:-1)

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

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

然后第一个ViewController将被解除分配。