2011-09-22 36 views
0

按钮时从另一个UIViewController中压这样我显示UIControllerView子类:的UIViewController - 波普不弹出

- (IBAction)openNextLevelViewController 
{ 
    NSLog(@"openNextlevelViewController"); 

    [self.navigationController pushViewController:nextLevelViewController animated:YES]; 

} 

和应用程序会从该视图返回按钮上按哪个​​触发此方法:

-(IBAction) returnToStart { 

    NSLog(@"returnToStart method called"); 
    [self.navigationController popViewControllerAnimated:YES]; 

} 

问题是显示的视图没有被破坏/释放在弹出。因此,当它被推入时,它不会执行viewDidLoad,它会启动一些变量。这可能会导致相关的问题,第二次通过时,当用户按下返回按钮时,“流行”不再导致返回到前一个控制器。

处理这个问题的最佳方法是什么?我可以将初始化代码移动到“willAppear”方法,但似乎可以几乎随机调用它。

+0

不确定你的意思是随机调用 - viewWillAppear是视图的生命周期和管道的一部分。随机调用它会很奇怪,不建议... – bryanmac

回答

2

那么,它没有得到释放,因为nextLevelViewController仍然保留在其他地方。最有可能在你的nextLevelViewController变量中。

- (IBAction)openNextLevelViewController 
{ 
    NSLog(@"openNextlevelViewController"); 
    // assuming you have nib already set up 
    UIViewController *nextLevelViewController = [[NextLevelViewController alloc] init]; 
    // RETAIN COUNT = 1 

    // navigationController retains your controller 
    [self.navigationController pushViewController:nextLevelViewController animated:YES]; 
    // RETAIN COUNT = 2 

    // Don't need it any more let navigation controller handle it. 
    [nextLevelViewController release] 
    // RETAIN COUNT = 1 (by NavigationController) 
} 

而且在

-(IBAction) returnToStart { 
    [self.navigationController popViewControllerAnimated:YES]; 
    // RETAIN COUNT = 0, dealloc will be called on your viewController, make sure to release all your retained objects. 
} 

现在,当你的控制器被弹出,它应该得到释放(不应该被保留其他地方)。下次你调用openNExtLevelViewController时,它会初始化viewController的一个新实例。

当我不再需要(显示),而不是将其保存在内存中时,我是释放viewController的粉丝。让navigationController和TabBarController尽可能处理viewController。

+0

@Jack BeNimble你很可能不会在你的视图控制器的dealloc中释放你的对象。我更新了代码保留计数 –

+0

甜。这解决了我所有的问题。非常感谢。我最初错过的是alloc&init。一旦我看到了,我知道了。 –

相关问题