考虑一个带有四个屏幕(A,B,C和D)的简单应用程序到导航堆栈中。导航按字母顺序排序A - > B - > C - > d。
在那种情况下,我习惯在视图控制器中创建一个显示另一个的成员变量。在我的例子中,A保持对B,B到C和C到D的引用。
在释放所有者控制器之前,这些引用将保留在内存中。我使用这种方法来最小化控制器的创建,并在显示先前显示的屏幕时获得一些优化。
但我不知道每次需要创建和自动释放每个控制器是否更好,而不保留它。会有更多的创作,但在一段时间内使用的记忆会更少。
什么是更好的方法?
答案 0 :(得分:1)
最好的方法是使用UINavigationController
。
此类提供了一组使用视图控制器的方法。有几种最简单的方法可以使用堆栈,比如push和pop以及几个更复杂的方法。例如,您可以检索堆栈中所有控制器的数组,然后根据需要重新排序/删除控制器/添加控制器/ ...它们,并推送此数组。
这种机制应该允许对你想要的每件事做。
在我看来,保存对其他控制器的引用是不正确的。创建新的控制器它是廉价的操作,不应该花费太多时间。如果您在控制器初始化期间创建/检索数据数据,只需重新设计模型级别(如果想要保存数据,则无法释放它)。
希望它有所帮助。
答案 1 :(得分:0)
更好的方法是不让视图控制器保留下一个。 UINavigationController
会自动保留添加到堆栈中的每个视图控制器,因此您不必这样做。但是如果你试图将已经在同一堆栈中的初始化视图控制器推送到堆栈,那么你就会遇到一些令人惊讶的崩溃/异常。
答案 2 :(得分:0)
UINavigationController
时, C
会保留视图B
的信息。当您再次推送到C
时,请检查它是否为nil
。如果它不是零,推动旧的。这是一种很好的方法,不会影响您应用的任何方面。如果由于C
的更改,您需要更改B
上的值,这只会很痛苦。