2010-12-10 98 views
0

我在mainViewController上有一個按鈕,它可以打開另一個視圖。保留對象的UIViewController

-(void)buttonTap:(id)sender 
{ 
    GameViewController *gameViewController = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:[NSBundle mainBundle]]; 

    Level *level = [levels objectAtIndex:currentLevelNumber]; 
    gameViewController.level = level; 

    UIView *gameview = gameViewController.view; 
    gameview.frame = CGRectMake(0, 0, 480, 320); 

    CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI/2.0); 
    [gameview setTransform:rotate]; 

    gameview.center = CGPointMake(160, 240); 

    [[self.view window] addSubview:gameview]; 
    [gameViewController release]; 
    gameViewController = nil; 
} 

在gameViewController中我有另一個關閉自身的按鈕。

-(IBAction)buttonTap:(id)sender 
{ 
    [self.view removeFromSuperview]; 
    //[self.view release]; 
} 

我在即使是在關閉後視圖仍然將觸發gameViewController的定時器。 viewDidUnload或dealloc根本沒有被觸發。 因此,遊戲最終會變得波濤洶涌。 這個gameviewcontroller什麼時候以及如何釋放其中包含的所有對象? 我一直在搜索整個互聯網,但無法找到正確的答案。

回答

0

當您添加視圖控制器的視圖時,視圖控制器上的某些生命週期方法不會被調用。這些包括了類似如下:

  • viewWillAppear:
  • viewDidAppear:
  • viewWillDisappear:
  • viewDidDisappear:
  • viewDidUnload可能會或可能不會被調用。我相信這是如果你明確地將view屬性設置爲nil
  • 所有旋轉相關的方法

相反,你可能想present a modal view controller。這將其正式添加到視圖控制器的層次結構中,有助於管理您的內存,並在適當時調用上述所有方法。如果你這樣做,你可以在調用presentModalViewController:animated:後立即釋放視圖控制器,並且它會一直保留,直到解除。

如果你決定你目前的做法,堅持(雖然我不建議這樣做),你應該做的時候gameview從屏幕上消失如下:

gameViewController.view = nil; 
[gameViewController release]; 
gameViewController = nil; 
+0

不知怎的,我沒有通過電子郵件通知答案。自從我沒有看到您的消息之前,我浪費了16個小時。 這聽起來像是要走的路,我會馬上嘗試。謝謝。 – gangt 2010-12-11 00:51:51