从UIPageViewController卸载viewControllers

我有一个UIPageViewController,我添加了其他viewControllers。 那些ViewControllers在数组中viewControllersArray = [[NSMutableArray alloc] init]; 我在这个数组上添加viewControllers,如下所示:

  [viewControllersArray addObject: infoViewController]; 

在我的数组上添加viewControllers之后:

 NSArray *initialViewControllers = [[NSArray alloc] initWithObjects:[viewControllersArray objectAtIndex:0], nil]; [self setViewControllers:initialViewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished){ NSLog(@"call back success");}]; 

上面的代码都是在我的UIPageViewController的viewDidLoad中完成的。

为了加载这个数组,我从获得了这些函数,我使用如下:

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { if ([viewControllersArray containsObject:viewController]) { NSInteger index = [viewControllersArray indexOfObject:viewController]; if (index  0) { return [viewControllersArray objectAtIndex:(index - 1)]; } } return nil; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { if ([viewControllersArray containsObject:viewController]) { NSInteger index = [viewControllersArray indexOfObject:viewController]; if (index < [viewControllersArray count] - 1) { return [viewControllersArray objectAtIndex:(index + 1)]; } } return nil; } 

现在的问题是,当您滑动时,下一个viewcontrollers会加载,等等。但是它们不会被卸载。 因此,我正在寻找一种方法来卸载已经传递的视图控制器以节省内存,当您向后滑动时,它们将被重新加载。

你的问题是你在viewControllersArray坚持你的视图控制器。 该数组对您添加到其中的每个对象都有一个强引用。 保存内存的最简单方法是在pageViewController:viewControllerBeforeViewController:pageViewController:viewControllerAfterViewController:数据源方法中动态创建请求的视图控制器。 这样,只有页面视图控制器才会有一个对视图控制器的强引用,并且一旦它移出屏幕就会释放(dealloc)它。

如果在运行中创建它们太昂贵,您可能会考虑在arrays中保留3个视图控制器:当前显示的控制器以及左侧和右侧的一个。

例:

 - (UIViewController *)pageViewController:(UIPageViewController *)pvc viewControllerBeforeViewController:(MyGreatViewController *)vc { NSUInteger index = vc.position - 1; //custom property on your VC if (index > 0) { return [[MyGreatViewController alloc] initWithPosition:index]; } return nil; } - (UIViewController *)pageViewController:(UIPageViewController *)pvc viewControllerBeforeViewController:(MyGreatViewController *)vc { NSUInteger index = vc.position + 1; //custom property on your VC if (index <= MAX_POSITION) { return [[MyGreatViewController alloc] initWithPosition:index]; } return nil; } 

请享用!

您不应该卸载View Controller。 如果内存不足,控制器会卸载其视图。 在代码中,使用-(void)viewDidUnload-(void)didReceiveMemoryWarning (iOS 6)来释放资源。 当UIPageViewController将显示某个页面时,控制器会重新创建卸载的视图并调用-(void)viewDidLoad (如果您手动自定义控制器)。