ios - iPhone - 删除整个 viewController,而不仅仅是它的 View

标签 ios iphone objective-c uiviewcontroller

我没有使用导航 Controller 或标签栏 Controller ,我没有使用 push/pop 方法或以模态方式呈现 View 。在我的主视图 Controller 中,我添加了一个 View Controller ,如下所示:

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

temporaryController = nextController;

[self.view addSubview:nextController.view];

此 View Controller 遵循委托(delegate)协议(protocol),当用户在此游戏 View 中完成时,调用此代码:

[delegate backToMenu:self];

在应用程序的主视图 Controller 中调用此函数:

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

    [temporaryController.view removeFromSuperview];
}

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

“Release”是一个永远不会与 ARC 一起使用的旧遗物,那么我如何才能完全删除使用 alloc/initWithNibName 创建的 viewController?

谢谢!

最佳答案

您还应该使用 View Controller 生命周期方法。

添加:

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 保留了它的委托(delegate),因此您可以删除动画并nil 委托(delegate)。

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

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

如果你想检查你的 View Controller 是否被解除分配,你应该实现 dealloc 方法并在其中放置一个断点。我建议在 NSLog 上设置一个断点,因为我不知道你已经注销了多少,所以它可能会被遗漏,有一个断点很明显 - 实际上停止了程序流。

关于ios - iPhone - 删除整个 viewController,而不仅仅是它的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23036423/

相关文章:

ios - 编译架构错误

ios - 广告另一个iOS设备后未调用didDiscoverPeripheral

iphone - 根据 iPhone 方向旋转 UIImageView

ios - 了解一对多的核心数据删除规则

ios - 如何将登录添加到我的 iOS PDF 阅读器应用程序?

ios - 加密 Realm 数据库并崩溃

ios - 现在 Swift 是开源的,我可以在不是 Mac 的计算机上编写和编译 iOS 应用程序吗?

ios - 如何从 Apple Watch 中的模态转场更改标签 "Cancel"

iphone - 新的 "Retina Display"对 iPhone 开发者意味着什么?

ios - 重新加载数据 - 表为空