从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
(如果您手动自定义控制器)。