9

似乎 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;

在pageViewController 本身释放之前,startingViewController 永远不会被释放

要重现此错误,只需使用基于页面的应用程序模板在 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]永远不会被释放。

有什么想法吗?谢谢!

4

5 回答 5

5

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

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

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

于 2013-12-06T19:47:49.590 回答
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);
    }];

beforeaddSubView并且完成块不会调用。

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

我去看看为什么没有回调,完善答案~

干杯

于 2015-07-23T09:35:28.427 回答
1

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

1)在 UIPageViewController 和 UIViewcontroller 之间存在循环引用(通过在两个类中将属性从强更改为弱来修复)

2) 主要修复包括改变

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

__weak __typeof__(self) weakSelf = self;
    [weakSelf setViewControllers:@[initialDetailsViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

我希望这可以帮助别人

于 2016-08-26T13:19:56.770 回答
0

同样的问题我通过将我的初始视图控制器保留在变量中来解决它,而不是在特定的 pageIndex 上创建相同的 vc 我只是重用它

于 2016-12-10T13:33:32.937 回答
-1

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

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

然后第一个 ViewController 将被释放。

于 2013-06-07T08:28:11.603 回答