3

全部,

ChildViewControllers在我的ParentViewController. 这是我的情况:我有ParentViewController一个动态数量的ChildViewControllers- 有时多达 20 个。它们包含在 a 中UIScrollView,并被分页。当我在页面上有几个时遇到问题(我只加载前两个,然后在我滑动时构建其他的),但是,ParentViewController由于内存而在其中有这么多开始导致一些崩溃。

其中ChildViewController有很多事情要做,我正在研究它以确保它尽可能高效,但是,我担心这种方法在旧设备上工作(因为我在 5S 上遇到了崩溃) .

似乎将视图控制器更改为视图会有所帮助,但由于 VC 很复杂,这将是一项相当大的努力。我的一个建议是从现有视图控制器的视图创建一个视图,并在视图上设置几个委托方法并通过这种方式与视图交互ParentViewController。与当前的使用方法相比,是否有人对该方法的效率有任何想法ChildViewControllers

我的另一个想法是建立一个习惯ContainerViewController并让所有的孩子在那里滑动,但我不确定这是否会给我带来比在UIScrollView.

有什么想法吗?

4

3 回答 3

5

我个人不主张重构您的代码以使用视图而不是视图控制器。视图控制器本身不太可能是内存问题的根源,而是它们跟踪的模型对象(以及视图控制器的视图使用的资产)。我认为关键是在视图控制器(及其视图)滚出屏幕时简单地删除它们。

在您的滚动逻辑中,当您添加滚动到视图中的子视图控制器时,您可能正在执行所有适当的包含调用:

UIViewController *newChildViewController = ...
[self addChildViewController:newChildViewController];
newChildViewController.view.frame = ...; 
[self.scrollView addSubview:newChildViewController.view];
[newChildViewController didMoveToParentViewController:self];

(请参阅 WWDC 2011 视频实现 UIViewController Containment,了解为什么执行这些包含调用很重要,即保持视图控制器层次结构与视图层次结构同步。)

当子视图滚动出视图时,您只需执行适当的包含调用以删除子控制器(及其视图):

[childViewControllerToRemove willMoveToParentViewController:nil];
[childViewControllerToRemove.view removeFromSuperview];
[childViewControllerToRemove removeFromParentViewController];
// also remove any other strong references you have to that childViewControllerToRemove

或者,您可能想要考虑使用UIPageViewController哪个(在 iOS 6+ 中)UIPageViewControllerTransitionStyleScrolltransitionStyle. 这简化了您必须编写的自定义容器代码的数量,以处理滚动进出视图的视图控制器。UIPageViewController正是针对这种通过一堆不同视图控制器的视图滚动(或分页)的情况而设计的。请参阅iOS 视图控制器目录中的页面视图控制器讨论。

于 2014-01-15T16:22:02.127 回答
0

我认为将它们全部移至UIView's 不会有帮助。aChildViewController.view您可以通过仅添加而无需从技术上将其添加为 childView来实现相同的效果。我会优化将视图加载到您的UIScrollView. 确保您每次只有 4 个视图加载到内存中。另一种选择是使用水平UITableViewUICollectionView这样您就可以获得它们内置的内存管理功能。

于 2014-01-15T16:19:04.980 回答
0

你可以把它变成一个表格视图,让单元格出队接管。那时你一次只会有几个记忆。

于 2014-01-15T16:23:45.780 回答