2011-08-24 50 views
0

我想了解如何正确释放目前我在转换到新的视图控制器。这里是我的代码:什么时候应该在过渡到新的时候释放当前的UIViewController?

// First create a CATransition object to describe the transition 
CATransition *transition = [CATransition animation]; 
transition.duration = 0.3; 
... 

// Add the transition to the current view's superview 
[self.view.superview.layer addAnimation:transition forKey:nil]; 

// Put together the controllers for the new screen 
MainMenuController *menu = [[MainMenuController alloc] initWithNibName:@"MainMenuController" bundle:[NSBundle mainBundle]]; 
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:menu]; 

// Transition 
[self.view.superview addSubview:nav.view]; 
[self.view removeFromSuperview]; 

// These can now be released 
[menu release]; // <- This works okay 
[nav release]; // <- This causes problems 

这个问题在理论上对我有意义。变量菜单可以释放,因为当我将它指定为新建立的UINavigationController的根视图控制器时,导航控制器保留了菜单。但是我没有看到导航本身有可能被保留的任何地方,当然,当我按照上面的方式发布时,我的用户界面就会变得不可思议。 (它不会崩溃,但整个菜单UI缺失。)

我猜我不明白的是当我预计发布导航。我的意思是,执行此代码的视图控制器对于这个世界来说并不长,所以它不能这样做。我应该在哪里打电话?

回答

0

你不应该这样做,因为你发现的原因。

您需要第三个控制器,高于您正在转换的两个控制器,以容纳导航控制器,以便控制器1可以释放自己。

+0

真的吗?这对我来说确实很有意义,但我认为我读过Apple不建议在视图控制器中使用视图控制器。我会看看我能否找到那个链接。也许我只是误解了。 –

+0

您不应该在视图控制器中显示视图控制器。即:同时在屏幕上没有两个。只有特殊的苹果“祝福”控制器(导航,选项卡,分割视图)才能同时在屏幕上显示多个视图控制器视图。但是您可以同时在内存中拥有两个视图控制器对象。 – jsd

+0

很酷,这很有道理。非常感谢! –

0
[self.view.superview addSubview:nav.view]; 

我对这段代码感觉不太好。我想你可以通过使用委托或通知来告诉你的superView控制器完成这个任务。

superView包含nav.view,所以它的控制器也应该保留nav.view的控制器。

+0

感谢Thanh-Cong的回复。我非常肯定,这是一个苹果示例代码项目,但我会仔细检查。无论如何,如果我按照jsd的建议切换到一个父视图控制器,则不需要这样做。 –

相关问题