いくつかのボタンを表示するメイン ビュー 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;