从UIPageViewController卸载viewControllers

时间:2013-04-05 11:22:44

标签: iphone ios objective-c xcode

我有一个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中完成的。

为了加载这个数组,我从<UIPageViewControllerDataSource>获得了这些函数 我这样用的是:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
    if ([viewControllersArray containsObject:viewController]) {
        NSInteger index = [viewControllersArray indexOfObject:viewController];
        if (index < [viewControllersArray count] && 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会加载等等。但是它们不会被卸载。因此,我正在寻找一种方法来卸载已经传递的视图控制器以节省内存,当您向后滑动时,它们将被重新加载。

2 个答案:

答案 0 :(得分:3)

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

如果在运行中创建它们太昂贵,您可能会考虑在阵列中保留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;
}

享受!

答案 1 :(得分:0)

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