Multiview应用程序每次切换页面时都会创建新的viewControllers?

时间:2011-11-21 05:59:42

标签: objective-c

我正在使用导航控制器并推送新的视图控制器以在多路Iphone应用程序之间切换。如下所示;

- (IBAction)startButton:(id)sender{
    GoalViewController *thisGoalViewController = [[GoalViewController alloc] 
                                                  initWithNibName:@"GoalViewController" bundle:nil];
    self.goalViewController = thisGoalViewController;
    [thisGoalViewController release];
    [[self navigationController] pushViewController:self.goalViewController animated:YES ];
}

一切正常。但是当我放置一个

 NSLog(@"Goal View ID: %p",self); 
在GoalViewController viewDidLoad方法中,每次切换页面时都会得到不同的值。

在GoalViewController中,我使用它来弹回;

- (IBAction)backButton:(id)sender{   
    [(UINavigationController*)self.parentViewController popViewControllerAnimated:YES];
}

正如我所说,一切正常,但我想我每次点击访问屏幕时都会创建GoalViewController的新实例。 从不调用GoalViewController中的viewDidUnload方法,所以我认为它们永远不会被释放,最终会导致崩溃。但是,通过多次切换页面,我无法崩溃。

我一直在寻找样本来将我的代码与其他人进行比较,看看我做错了什么,但到目前为止,我所做的一切看起来都是正确的做法。

我想我正在寻找一种方法来测试我推进的goalViewController是否仍然打开并切换到它而不是分配一个新的。

我真的很感激对此的一些见解。 谢谢, 格雷格

P.S。

我实际上尝试在viewWillAppear方法中插入它。

`NSMutableArray *allControllers = [[NSMutableArray alloc]     initWithArray:self.navigationController.viewControllers];
    NSLog(@"Controllers: %@",allControllers);`

当我在启动目标视图之间切换时,这是我得到的输出。 Splash View ID仍然是内容,但每次都会更改目标视图ID。

2011-11-21 01:14:51.388 Controllers: ("<SplashViewController: 0x64468c0>")
2011-11-21 01:14:51.389 Controllers: <SplashViewController: 0x64468c0>
2011-11-21 01:14:58.494 Controllers: <GoalViewController: 0x6458ad0>
2011-11-21 01:14:58.495 Controllers: (
    "<SplashViewController: 0x64468c0>",
    "<GoalViewController: 0x6458ad0>"
)
2011-11-21 01:15:06.898 Controllers: <SplashViewController: 0x64468c0>
2011-11-21 01:15:11.139 Controllers: <GoalViewController: 0x5771660>
2011-11-21 01:15:11.140 Controllers: (
    "<SplashViewController: 0x64468c0>",
    "<GoalViewController: 0x5771660>"

谢谢,Greg

1 个答案:

答案 0 :(得分:0)

每次调用

时,您确实在创建一个新的控制器

[[GoalViewController alloc] initWithNibName:@"GoalViewController" bundle:nil]

我建议做的是在startButton方法之外创建一次GoalViewController(就像在父视图控制器的viewWillAppear方法中一样),并将其保存为父对象的成员变量。然后,您可以将其推送并弹出您心中的内容,每次目标视图ID都将保持相同的指针。

不要忘记在解除父级或卸载父级时释放您的GoalViewController(不确定您是否使用ARC)。

希望此信息有所帮助!