2011-09-22 62 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。一旦我看到了,我知道了。 –

相關問題