如何管理潜在的无限推动视图控制器到导航控制器堆栈? iOS版

时间:2013-12-18 19:17:35

标签: ios objective-c memory uiviewcontroller uinavigationcontroller

我有一个由UINavigationController组成的应用程序,可以从3个不同的选项卡中推送ViewControllers。

我预见到的问题是当前的结构允许用户无休止地将VC添加到堆栈中。

我有一个名为pharmaceuticals的标签,另一个叫做病原体。如果你在药物中钻得足够远,你可以得到它有效的病原体清单,用户可以选择一种病原体来查看它的更多信息。这导致应用程序推动新的病原体VC。

现在,用户可以深入查看病原体易受影响的药物清单并选择它,从而在药品选项卡中生成新的VC。

依旧等......

每次在内存占用量上增加1.5Mb。

我怎样才能最好地管理这个?

2 个答案:

答案 0 :(得分:5)

您应该专注于最小化内存占用,方法是释放您可以轻松重新创建的资源,而不是试图阻止用户将100个视图控制器推送到您的堆栈上。 Apple也不这样做。

打开“iTunes Store”应用程序并搜索“Hugh Laurie”,选择专辑“Let Them Talk”,然后选择“Hugh Laurie>”,然后选择“Let Them Talk”,然后选择“Hugh Laurie> ;”等等。你可以继续前进和前进。当用户长时间执行此操作时,应用程序可能会耗尽内存并崩溃。

如果你试图在你的丰田皮卡上加载20吨砖块,它可能会像空的Capri Sun包一样被粉碎。这是故意破坏性行为,恕我直言,如果用户强行尝试重载,应用可以终止。

enter image description here

但是,您可以使这一点几乎无法访问,因此通过在屏幕外视图控制器中释放内存,这种情况不太可能发生。实现didReceiveMemoryWarning(例如:How to implement didReceiveMemoryWarning?)以释放您可以轻松地从磁盘或网络(图像,核心数据对象等)重新创建的内容。这样,你可以降低你的内存占用率,如果他们手上有几个小时,你的用户只能让你的应用程序崩溃而没有比推动视图控制器更好的事情。哪个会很难过。

答案 1 :(得分:2)

您可以实现自己的UINavigationController子类。您需要至少实施pushViewController:animated:popViewControllerAnimated:。在推送期间,您将丢弃其中一个视图控制器(从而释放内存),而在pop中,您将使用您保留的数据再次创建它。基本上,您将从保持整个视图控制器堆栈切换到只有几个元素,并使用逻辑来恢复堆栈中的那些元素。

这是一个简化的描述。在实际应用中,您需要至少保留以前的视图控制器,以便您的后退按钮和从边缘滑动的后退手势能够顺利运行。