Ios 重新加载UIViewController并解除锁定

Ios 重新加载UIViewController并解除锁定,ios,objective-c,Ios,Objective C,我有一个基于回合的游戏,允许用户同时玩多场比赛。轮换后,用户可以单击“转到下一场比赛”按钮 单击按钮时,我只需创建一个新的GameViewController并按下它。但是,在执行此操作时,旧的GameViewController不会解除锁定,有时会与新的viewController发生冲突(就像在旧的viewController上执行增加分数的块,会增加新的viewController上的分数) 我之所以要推送一个新的viewController而不是nuke并清理旧的viewControll

我有一个基于回合的游戏,允许用户同时玩多场比赛。轮换后,用户可以单击“转到下一场比赛”按钮

单击按钮时,我只需创建一个新的GameViewController并按下它。但是,在执行此操作时,旧的GameViewController不会解除锁定,有时会与新的viewController发生冲突(就像在旧的viewController上执行增加分数的块,会增加新的viewController上的分数)

我之所以要推送一个新的viewController而不是nuke并清理旧的viewController并重用它,是因为我想要推送动画,出于安全原因,我想要一个干净的

因此,我猜在创建和推送新的viewcontroller时,它实际上不是新的,而是旧的

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil];
            GameViewController *gameViewController = (GameViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"GameViewController"];
            gameViewController.matchObject = match;
            [weakSelf.navigationController pushViewController:gameViewController animated:YES];

提前感谢

如果您只需推送一个新的视图控制器,您的旧视图控制器将仍然存在。它只是不可见,因为新的在上面。您可以尝试以下操作(假设您尚未在其他地方删除旧的视图控制器):


您正在推送
GameViewController
的新实例,但您的旧控制器不会被销毁,因为它存储在导航控制器堆栈中。有一个潜在的内存泄漏-如果你每转一圈就推一个新的控制器,并且从不弹出它

在新控制器动画完成后,可以通过更改属性直接更新导航堆栈。 (例如

// I assume you using ARC.
NSMutableArray *temp = [NSMutableArray array];
[temp addObjectsFromArray:self.navigationController.viewControllers]
[temp removeObjectAtIndex:temp.count - 2];
self.navigationController.viewControllers = [temp copy];
但是这个解决方案对我来说并不好)


您可以在不使用导航控制器的情况下使用漂亮的推送转换,请查看类。

您是否尝试过在dealloc方法中使用NSLog来查看它是否被调用?我相信在这一行
[weakSelf.navigationController popViewControllerAnimated:NO]之后,当前的视图控制器将被销毁
,最好使用
strong
变量。这不是OP想要的吗?他想调用dealloc,所以我猜他想销毁它
[weakSelf.navigationController pushViewController:gameViewController动画:是]
没有意义,因为
weakSelf
将为零,他将无法访问
navigationController
为什么在此之后weakSelf应为零?好吧,我100%不知道,但看起来此代码是在块内执行的,
weakSelf
具有
\uu-weak
修改器以避免强引用循环。当前控制器从导航堆栈中弹出后,将不会有对它的引用,它将被销毁,所有的
\u弱
引用将被清空。谢谢!成功了。但是需要为删除设置延迟,并让新的加载。
// I assume you using ARC.
NSMutableArray *temp = [NSMutableArray array];
[temp addObjectsFromArray:self.navigationController.viewControllers]
[temp removeObjectAtIndex:temp.count - 2];
self.navigationController.viewControllers = [temp copy];