【问题标题】:iPhone/iPad UINavigationController property inside UIViewController?UIViewController 内的 iPhone/iPad UINavigationController 属性?
【发布时间】:2012-02-08 10:28:54
【问题描述】:

UIViewController里面有属性:

 @property(nonatomic, readonly, retain) UINavigationController *navigationController

我不太确定这个属性是如何使用的......按照我的看法,如果你有名为 navController 的导航控制器并输入如下代码:

[navController pushViewController:nextController animated:YES];  

发生了几件事。首先将 nextController 推到 navController 堆栈的顶部。其次,navController 保留了 nextController。第三,用navController初始化nextController(navigationController)的readonly属性。这样 navController 会保留 nextController,而 nextController 会保留 navController。因此,如果您释放 navController,它不会被销毁,因为它被其堆栈上的所有 UIViewControllers 保留。释放它的唯一方法是从堆栈中弹出所有项目,然后释放它。

这是所有这些功能的方式,还是我遗漏了什么?

【问题讨论】:

    标签: iphone ipad uiviewcontroller uinavigationcontroller


    【解决方案1】:

    是的,你错过了当调用 nextController 的 dealloc 方法时,它会释放它的导航控制器。因此,当您释放 navController 时,它将释放其所有推送的视图控制器,并且它们将释放它们的 navController。 换句话说,当你释放一个导航控制器时(假设释放计数为零),它会弹出所有压在它上面的视图控制器。

    【讨论】:

    • release方法在dealloc方法内部调用,当对象的retain count为零时调用。因此,如果您在 navController 上调用 release,他的保留计数不为零(请记住堆栈上的所有 UIViewController 仍在保留它)并且不会调用他的 dealloc 方法。问题是,在 navController 的 dealloc 方法中,所有推送的控制器都被释放(当你释放它们时,所有 navController 保留计数应该为零,而不是在那之前),但是这个方法永远不会被调用。
    • 现在我明白了这个问题。但是当你释放一个导航控制器时,事情确实很好,并且没有出现泄漏。在导航控制器上保留视图控制器是暂时的,并且仅在导航控制器添加子视图时。
    • 更多信息。我已经对其进行了测试,当您推送视图控制器时,您会为导航控制器获得一个递增的 retainCount,但直到该界面循环结束。然后导航控制器的保留计数再次恢复为之前的值。所以它不是视图控制器真正的保留属性。
    【解决方案2】:

    如果您已经有一个导航控制器并在其中推送一个视图控制器,那么您可以使用此属性来处理导航控制器..例如

    UIViewController *vc = [[UIViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc];
    

    现在您的 vc 在导航控制器中......如果您想显示另一个 vc,您可以这样做 [vc.navigationController pushViewController:detailViewController animated:YES];

    对于发布你只需要[vc release]; [navController realese];

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多