我有一个主视图 mainWindow,它显示了几个按钮。两个按钮都创建了一个新的 UIViewController (mapViewController),但是一个会开始游戏,另一个会继续游戏。两个按钮都通过 StoryBoard 链接到同一个视图。由于我没有使用 NavigationController,因此它们被绑定到模态视图。
所以在一个典型的游戏中,如果一个人开始游戏,然后又回到主菜单,他会触发:
[self dismissViewControllerAnimated:YES completion:nil ];
返回主菜单。我会假设视图控制器此时已发布。
用户通过打开另一个 mapViewController 实例使用第二个按钮恢复游戏。然而,正在发生的事情是一些触摸事件将触发原始实例上的方法(并向它们写入状态更新 - 因此对当前视图不可见)。当我在 mapViewController 代码中放置断点时,我可以看到实例将是一个或另一个(其中一个应该被释放)。
我已经尝试将一个委托放到 mainWindow 来清除视图:
[self.delegate clearMapView];
在主窗口中的位置
- (void) clearMapView{
gameWindow = nil;
}
我也试过
self.view=nil;
在地图视图控制器中。
mapViewController 代码包含 MVC 代码,其中模型是静态的。我想知道这是否会阻止 ARC 发布视图。
model.m 包含:
static CanShieldModel *sharedInstance;
+ (CanShieldModel *) sharedModel
{
@synchronized(self)
{
if (!sharedInstance)
sharedInstance = [[CanShieldModel alloc] init];
return sharedInstance;
}
return sharedInstance;
}
另一个可能有线索但到目前为止还没有成功的帖子是UIViewController 在弹出时没有被释放
我在 ViewDidLoad 中有:
// checks to see if app goes inactive - saves.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resignActive) name:UIApplicationWillResignActiveNotification object:nil];
与 ViewDidUnload 中的对应:
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
有没有人有什么建议?
编辑:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
NSString *identifier = segue.identifier;
if ([identifier isEqualToString: @"Start Game"]){
gameWindow = (ViewController *)[segue destinationViewController];
gameWindow.newgame=-1;
gameWindow.delegate = self;
} else if ([identifier isEqualToString: @"Resume Game"]){
gameWindow = (ViewController *)[segue destinationViewController];
gameWindow.newgame=0;
gameWindow.delegate = self;