我没有使用导航 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/