iPhone - 删除整个viewController,而不仅仅是它的视图

时间:2014-04-12 21:38:33

标签: ios iphone objective-c uiviewcontroller

我没有使用导航控制器或标签栏控制器,我没有使用push / pop方法或以模态方式显示视图。在我的主视图控制器中,我正在添加一个像这样的视图控制器:

UIViewController *nextController;
nextController = [[GamePlayViewController alloc] initWithNibName:@"GamePlayView" bundle:nil];
[nextController performSelector:@selector(setDelegate:) withObject:self];

temporaryController = nextController;

[self.view addSubview:nextController.view];

此视图控制器遵循委托协议,当用户在此游戏视图中完成时,将调用此代码:

[delegate backToMenu:self];

在app的主视图控制器中调用此函数:

- (void)backToMenu:(GamePlayViewController *)sender {
    NSLog(@"back to menu");

    [temporaryController.view removeFromSuperview];
}

使用removeFromSuperview删除视图似乎只是删除了视图,但我可以看到由于NSLogging,代码仍在该删除视图的.m文件中执行。该视图仍在应用程序的内存中。它并没有像我希望的那样被丢弃。

"推出"是一个永远不会与ARC一起使用的旧遗物,那么如何完全删除使用alloc / initWithNibName创建的viewController?

谢谢!

1 个答案:

答案 0 :(得分:1)

您还应该使用视图控制器生命周期方法。

添加:

GamePlayViewController *nextController = [[GamePlayViewController alloc] initWithNibName:@"GamePlayView" bundle:nil];
nextController.delegate = self;
[self addChildViewController:nextController];
[self.view addSubview:nextController.view];
[nextController didMoveToParentViewController:self];

temporaryController = nextController;

卸下:

[temporaryController didMoveToParentViewController:nil];
[temporaryController.view removeFromSuperview];
[temporaryController removeFromParentViewController];
temporaryController = nil;

如果temporaryController是一个强大的属性(或者你已经使用过iVar),那么删除它后你应该nil

CAAnimation保留其委托时,您可以删除动画并nil删除委托。

-(void)didMoveToParentViewController:(UIViewController *)parentViewController
{
    [super didMoveToParentViewController:parentViewController];

    if (!parentViewController) {
        CAAnimation *animation = [movingObject.layer animationForKey:@"animatePositionX"];
        animation.delegate = nil;
        [movingObject.layer removeAnimationForKey:@"animatePositionX"];
    }
}

如果要检查视图控制器是否已解除连接,则应实现dealloc方法并在其中放置断点。我建议在NSLog之间设置一个断点,因为我不知道你已经注销了多少,所以可能会错过,断点很明显 - 实际上是停止了程序流程。