我没有使用导航控制器或标签栏控制器,我没有使用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?
谢谢!
答案 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
之间设置一个断点,因为我不知道你已经注销了多少,所以可能会错过,断点很明显 - 实际上是停止了程序流程。