UINavigationController - 何时释放推送的视图控制器等

时间:2010-11-24 10:51:44

标签: iphone objective-c ios uikit uinavigation

为大块'o'文本道歉,但我有点像一个初学者,正在使用UINavigationController作为我正在编写的应用程序的一部分,我只是想知道我应该如何处理添加查看控制器到UINavigationController以及何时(如果有的话)我应该释放它们。

正如我所看到的,添加视图控制器时有两种可能的方法:

  1. 为管理类中的每个视图控制器设置一个实例变量。在将其推入导航控制器之前初始化它(如果实例变量为nil)。如果它不是nil,则在管理类的dealloc方法中释放视图控制器。

  2. 将视图控制器创建为方法中的局部变量,并在立即释放之前将其推送到导航控制器。

  3. 但是,我不确定每一项的有效性。 (我的直觉是采用实例变量方法,但也许这是因为我不了解。)

    深入挖掘,我怀疑我的困惑与以下事实有关:我不太了解我是否负责处理推入导航控制器堆栈的视图控制器,或者是否当它们从视图控制器堆栈弹出时会自行处理它们。 (例如:当用户点击“后退”按钮时。)

    如果它是前者,那么我可以看到我需要使用实例变量方法并在管理对象中实现UINavigationControllerDelegate方法,以确定何时应该释放并忽略每个视图控制器等。

    最后(对于来世的奖励积分)你怎么能轻易判断一个方法是否会增加其中一个参数的保留计数? (文档中似乎没有任何线索,但也许我遗漏了一些显而易见的东西。)例如,当我使用某些内容时......

    [[self navigationController] pushViewController:exampleVC animated:YES];
    

    ...这会增加视图控制器上的保留计数吗? (再一次,我的直觉是应该,但在这些危险时期,这与巧克力防火设备一样多用。)

    提前致谢。

1 个答案:

答案 0 :(得分:1)

这很简单。如果你将一个对象交给另一个对象做一些不受你直接控制的对象,它会保留你传递的对象(几乎所有东西都是这样的)。

例如:所有NSArray / Dictionary / Set Collections都会保留您的对象,因为如果您要释放包含在此类记录中的对象,则某些条目将无效且该集合不会知道。

对于导航控制器和类似的东西,情况完全相同,因为您不知道是否以及何时显示或丢弃了viewcontroller。