似乎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] 永远不会被释放。
有关于此的任何想法? 谢谢!
答案 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将被解除分配。