我想知道是否有办法检查我的应用程序中是否堆叠了太多的视图。
我的应用设计是:
导航控制器 - >表视图(表视图的工作方式与root VC类似)
从表格视图我可以打开菜单VC作为模态segue,并在那里形成我可以打开登录VC作为模态segue,如果我登录我最终在帐户页面上如下:
导航控制器 - >表格视图 - >菜单 - >登录 - >帐户页面
从帐户页面我可以更深入了解:
导航控制器 - >表格视图 - >菜单 - >登录 - >帐户页面 - >列表设置页面 - >修改设置页面
如果算上导航控制器,现在我有7个VC堆叠,即使其中两个显示为模态VC。
我的应用程序没有崩溃,但这是一个很好的方法吗?如果我理解正确的应用程序现在必须在ipad上运行分屏时共享CPU,所以我不确定这种方式是否会占用太多内存。
或者我应该简单地让帐户VC成为新的根VC并重置堆栈?当回到表格视图时,再次将其作为新的根VC。
答案 0 :(得分:4)
视图控制器是轻量级对象。如果你的担心是记忆,你应该对记忆警告做出反应。例如。在viewcontrollers的viewDidDisappear
方法中。您可以释放任何缓存的图像,如果VC不可见则删除视图。在didReceiveMemoryWarning
中并不总是需要释放缓存的对象和图像,因为用户可能会返回到屏幕,并且如果没有内存问题,您希望避免重新加载所有内容。 UINavigationController
是帮助系统释放内存而不牺牲用户体验的正确位置。
您当然可以通过查看viewControllers.count
的属性TreeMap<String, Integer> map = new TreeMap<String, Integer>();
来检查导航控制器堆栈上有多少个视图控制器。
将堆栈重置为始终只有一个根视图控制器很好但通常非常复杂。在导航控制器中也不太可能。
您应该使用Instruments检查内存消耗并验证您是否正确对内存警告作出反应。可以在模拟器中手动触发内存警告。
答案 1 :(得分:2)
因此,当视图堆叠在导航控制器上时,即使它们在屏幕外,它们也不会从内存中完全取消分配。没有严格的最大堆叠视图数量,但你应该对它很聪明。
如果您担心RAM使用情况,请务必充分利用viewWillAppear
和viewWillDisappear
,执行清理操作,例如清除手势识别器和观察者,并停止任何可能的侦听器在后台线程上运行。这将减少视图在屏幕外使用的内存量;并且无论如何都是很好的编码实践。
希望这有所帮助。
编辑:Felix也对内存警告提出了一个好处,如果iOS关注应用程序的内存使用情况,它会发出内存警告,你可以用felix解释的方式做出反应。