iphone - 从 UIPageViewController 卸载 viewController

标签 iphone ios objective-c xcode

我有一个 UIPageViewController,我可以在其中添加其他 viewController。这些 ViewControllers 在数组 viewControllersArray = [[NSMutableArray alloc] init]; 中我像这样在这个数组上添加 viewControllers:

        [viewControllersArray addObject: infoViewController];

将 viewController 添加到我的数组后:

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;
}

现在的问题是,当您滑动时,下一个 View Controller 会加载,等等。但它们不会被卸载。所以我正在寻找一种方法来卸载您已经传递的 View Controller 以节省内存,并且当您向后滑动时它们将被重新加载。

最佳答案

您的问题是您在 viewControllersArray 中保留了您的 View Controller 。该数组包含对您添加到其中的每个对象的强引用。节省内存的最简单方法是在 pageViewController:viewControllerBeforeViewController:pageViewController:viewControllerAfterViewController: 数据源方法中即时创建请求的 View Controller 。这样,只有页面 View Controller 将对 View Controller 有强引用,并在它移出屏幕后释放(释放)它。

如果即时创建它们的成本太高,您可以考虑只在数组中保留 3 个 View Controller :当前显示的一个以及紧靠左侧和紧靠右侧的一个。

例子:

- (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;
}

尽情享受吧!

关于iphone - 从 UIPageViewController 卸载 viewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15832644/

相关文章:

iphone - 以编程方式将 UIButton 添加到 Storyboard View

ios - 基于CGPoint在屏幕上绘制UIView

ios - 先下载数据,然后在 TableViewcontroller 上显示

objective-c - NSObject 子类作为属性

ios - 如何从 base64 编码的字符串中获取音频/视频?

iphone - 监控重大位置变化的 iOS 应用程序是否会在设备重启时重新启动?

ios - 在 iOS 中获取谷歌地图的中心

iphone - NSMutableArray 存在内存泄漏

objective-c - 使用 Mantle 将多个键组合成单个属性

iphone - UITextField SecureTextEntry 字段将键盘从数字键盘更改为通用键盘