UIViewController保留对象

时间:2010-12-10 07:44:21

标签: uiviewcontroller

我在mainViewController上有一个按钮,可以点击打开另一个视图。

-(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何时以及如何释放其中包含的所有对象? 我一直在网上搜索,但找不到合适的答案。

1 个答案:

答案 0 :(得分:0)

添加视图控制器的视图时,不会调用视图控制器上的某些生命周期方法。其中包括以下内容:

  • viewWillAppear:
  • viewDidAppear:
  • viewWillDisappear:
  • viewDidDisappear:
  • 可能会或可能不会调用
  • viewDidUnload。我相信如果您明确将view属性设置为nil
  • 所有与轮换相关的方法

相反,您可能想要present a modal view controller。这正式将其添加到视图控制器的层次结构中,有助于管理内存,并在适当时调用上述所有方法。如果你这样做,你可以在调用presentModalViewController:animated:后立即释放视图控制器,它将一直保留到被解雇。

如果您决定坚持使用当前的方法(虽然我不建议这样做),您应该在屏幕上gameview 消失时执行以下操作:

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