所有
在ChildViewControllers
中使用多个ParentViewController
时,我遇到了一些性能/内存问题。以下是我的情况:我的ParentViewController
动态编号为ChildViewControllers
- 有时多达20个。它们包含在UIScrollView
中,并且会被分页。当我在页面上有几个时,我遇到了问题(我只是加载前两个,然后在刷卡时构建其他的)但是,在ParentViewController
内有多个崩溃开始导致一些崩溃由于记忆。
ChildViewController
中有很多内容,我正在通过它来确保它尽可能高效,但是,我担心这种方法适用于旧设备(因为我我在5S上遇到了崩溃。
似乎将视图控制器更改为仅视图会有所帮助,但由于VC很复杂,因此这是一项非常大的工作。我的一个建议是从现有视图控制器的视图创建视图,并在视图上设置多个委托方法,并以ParentViewController
方式与视图交互。是否有任何人对该方法的效率有任何想法,而不是使用ChildViewControllers
的当前方法?
我的另一个想法是建立一个自定义ContainerViewController
并让所有的孩子都在那里轻扫,但我不确定这是否会比使用{{1 }}
有什么想法吗?
答案 0 :(得分:5)
我个人不会主张重构您的代码以使用视图而不是查看控制器。视图控制器本身不太可能是内存问题的根源,而是它们跟踪的模型对象(以及视图控制器视图使用的资源)。我认为关键是当它们滚出屏幕时简单地删除视图控制器(和它们的视图)。
在滚动逻辑中,当您添加滚动到视图的子视图控制器时,您可能正在进行所有适当的包含调用:
UIViewController *newChildViewController = ...
[self addChildViewController:newChildViewController];
newChildViewController.view.frame = ...;
[self.scrollView addSubview:newChildViewController.view];
[newChildViewController didMoveToParentViewController:self];
(请参阅WWDC 2011视频Implementing UIViewController Containment,了解执行这些包含调用的重要性,即保持视图控制器层次结构与视图层次结构同步。)
当子视图滚动出视图时,您只需执行适当的包含调用以删除子控制器(及其视图):
[childViewControllerToRemove willMoveToParentViewController:nil];
[childViewControllerToRemove.view removeFromSuperview];
[childViewControllerToRemove removeFromParentViewController];
// also remove any other strong references you have to that childViewControllerToRemove
或者,您可能需要考虑使用UIPageViewController
(在iOS 6+中)为UIPageViewControllerTransitionStyleScroll
提供滚动页面视图(transitionStyle
)。这简化了您必须编写的自定义容器代码的数量,以处理滚动进出视图的视图控制器。 UIPageViewController
被精确地设计用于通过一堆不同的视图控制器视图滚动(或分页)的情况。请参阅适用于iOS的View Controller Catalog。中的Page View Controllers讨论。
答案 1 :(得分:0)
我认为将它们全部移至UIView
会有所帮助。你可以通过添加aChildViewController.view
来实现同样的效果,而无需在技术上将其添加为childView。我会优化视图加载到UIScrollView
。确保你只有4个视图一次加载到内存中。另一种选择是使用水平UITableView
或UICollectionView
,这样您就可以获得他们内置的内存管理功能。
答案 2 :(得分:0)
您可以将其转换为tableview,让单元格出列接管。那时你只会有一些内存。