代码之家  ›  专栏  ›  技术社区  ›  John Parker

UINavigationController-何时释放按下的视图控制器等

  •  0
  • John Parker  · 技术社区  · 14 年前

    很抱歉有这么大的block'o'文本,但是我有点像一个初学者,正在尝试使用UINavigationController作为我正在编写的应用程序的一部分,我只是想知道我应该如何处理向UINavigationController添加视图控制器,以及何时(如果有)应该释放它们。

    在我看来,添加视图控制器时有两种可能的方法:

    1. 为管理类中的每个视图控制器都有一个实例变量。在把它推到导航控制器上之前初始化它(如果实例变量为nil)。如果视图控制器不是nil,则随后在管理类的dealloc方法中释放它。

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

    但是,我不确定这些方法的有效性。(我的直觉是采用实例变量的方法,但这可能是因为我对实例变量缺乏理解。)

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

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

    最后(对于来生中的加分),你如何容易地判断一个方法是否会增加其参数之一的保留计数?(文档中似乎没有任何线索,但也许我遗漏了一些明显的东西。)例如,当我使用一些类似于。。。

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

    …这会增加视图控制器上的保留计数吗?(再一次,我的直觉是 应该 ,但在这些危险时期,这和巧克力消防队员的作用差不多。)

    提前谢谢。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Dunkelstern    14 年前

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

    例如:所有NSArray/Dictionary/Set集合都保留您的对象,因为如果要取消分配此类记录中包含的对象,则某些条目将无效,并且集合将不知道。

    导航控制器和类似的东西也是如此,因为你不知道你的viewcontroller是显示的还是丢弃的。