1

我有一个主视图 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;
4

1 回答 1

0

我的理论是,某些东西对您的UIViewController.

segue您上面发布的代码来看,您似乎保留了对gameWindow模态视图控制器的引用。如果是这种情况,那么您需要__weak在它的声明前面添加,以便mapViewController在您解雇它时它不会保留您。

于 2012-10-24T12:48:47.853 回答