UINavigationController - 何时释放推送的视图控制器等
Posted
技术标签:
【中文标题】UINavigationController - 何时释放推送的视图控制器等【英文标题】:UINavigationController - When to release pushed view controllers, etc 【发布时间】:2010-11-24 10:51:43 【问题描述】:为大块“o”文本道歉,但我有点像初学者,我正在尝试使用 UINavigationController 作为我正在编写的应用程序的一部分,我只是想知道我应该如何处理添加查看控制器到 UINavigationController 以及何时(如果有的话)我应该释放它们。
在我看来,添加视图控制器时有两种可能的方法:
对于管理类中的每个视图控制器都有一个实例变量。在将其推送到导航控制器之前对其进行初始化(如果实例变量为 nil)。随后在管理类的 dealloc 方法中释放视图控制器,如果它不是 nil。
将视图控制器创建为方法中的局部变量,并在立即释放之前将其推送到导航控制器。
但是,我不确定这些的有效性。 (我的直觉是使用实例变量方法,但这可能是由于我缺乏理解。)
再深入一点,我怀疑我的困惑与我不太了解我是否负责处理推送到导航控制器堆栈上的视图控制器,或者它是否负责当它们从视图控制器堆栈中弹出时,将自行处理它们。 (例如:当用户点击“返回”按钮时。)
如果是前者,那么我可以看到我需要使用实例变量方法并在管理对象中实现 UINavigationControllerDelegate 方法来确定我应该何时释放和取消每个视图控制器等。
最后(对于来世的奖励积分),您如何轻松判断一个方法是否会增加其参数之一的保留计数? (文档中似乎没有任何线索,但也许我遗漏了一些明显的东西。)例如,当我使用类似...
[[self navigationController] pushViewController:exampleVC animated:YES];
...这会增加视图控制器的保留计数吗? (再一次,我的直觉是它应该,但在这些危险时期,这与巧克力防火板的用途差不多,等等。)
提前致谢。
【问题讨论】:
【参考方案1】:这很简单。如果你将一个对象交给另一个对象,而另一个对象对它做一些不受你直接控制的事情,它会保留你传递的对象(几乎所有事情都是这样)。
例如:所有 NSArray/Dictionary/Set 集合都会保留您的对象,因为如果您取消分配此类记录中包含的对象,则某些条目将无效并且集合将不知道。
导航控制器和类似的东西也是如此,因为您不知道是否以及何时显示或丢弃您的视图控制器。
【讨论】:
感谢您的启发 - 我从来没有从这些方面考虑过。 嗨 Dunkelstern,距离这篇文章已经有一段时间了,但是您能否提供指向某些 Apple 文档的链接,明确提到传递的对象被保留。我已经尝试并同意这一点,但找不到任何证据。 (如果文档没有提到您永远不应该依赖它们,那么记录保留计数可能已经证明了这一点:P) 恐怕你得通读《Cocoa 基础指南》,里面有一章“内存管理的工作原理”(developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…)以上是关于UINavigationController - 何时释放推送的视图控制器等的主要内容,如果未能解决你的问题,请参考以下文章
带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller
带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController
在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?
UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr
从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)