1

いくつかのボタンを表示するメイン ビュー mainWindow があります。どちらのボタンも新しい UIViewController (mapViewController) を作成しますが、一方はゲームを開始し、もう一方はゲームを再開します。どちらのボタンも StoryBoard を介して同じビューにリンクされています。NavigationController を使用していないため、モーダル ビューにセグエされています。

したがって、典型的なゲームでは、ある人がゲームを開始してからメイン メニューに戻ると、次のようにトリガーされます。

[self dismissViewControllerAnimated:YES completion:nil ];

メインメニューに戻ります。この時点でView Controllerがリリースされていると思います。

ユーザーは、mapViewController の別のインスタンスを開いて、2 番目のボタンでゲームを再開します。何が起こっているかというと、いくつかのタッチ イベントが元のインスタンスでメソッドをトリガーすることです (そして、ステータスの更新をそれらに書き込むため、現在のビューには表示されません)。mapViewController コードにブレークポイントを配置すると、インスタンスがいずれかになることがわかります (どちらかを解放する必要があります)。

ビューをクリアするmainWindowにデリゲートを配置しようとしました:

    [self.delegate clearMapView];

メインウィンドウのどこに

- (void) clearMapView{
    gameWindow = nil;
}

私も試してみました

self.view=nil;

mapViewController で。

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

My theory is that something is holding a strong reference to your UIViewController.

From the segue code you posted above, it looks like you are keeping a reference gameWindow to the modal view controller. If this is the case, then you'll want to add __weak in front of it's declaration so that it isn't holding on to your mapViewController when you dismiss it.

于 2012-10-24T12:48:47.853 に答える