2

私はメインビューコントローラと設定ビューコントローラを持つiPadアプリを持っています。メインビューに設定ビューが表示されたら、設定ビューをフルスクリーンで表示します。メモリ警告が発生するまで、動作する設定ビューには却下ボタンがあります。設定ボタンがオンスクリーンになっている間にメモリ警告が発生すると、警告を消すことを拒否します。言い換えればメモリ警告が表示されているView Controllerを破壊しますか?

、この作品:

  • アプリケーションの起動を - >ショーメイン表示 - >表示設定表示 - > [設定]ビュー
  • を閉じ

これはしていません:

  • アプリケーション起動 - >メインビュー表示 - >設定表示 - >メモリ警告 - >設定解除表示

設定ビューはそのまま残ります。

私は、第1世代のiPadのiOS 5でこのアプリケーションを実行しています。 (私はiOS 4をサポートしていません)

どうすればこの問題を解決できますか?

編集:

- (void) showSettings{ 

    if (!self.settingsViewController) { 

    //Create the navigation controller and the root view for the settings panel 
    SettingsViewController *settingsRootView = [[SettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    UINavigationController *settingsView = [[UINavigationController alloc] initWithRootViewController:settingsRootView]; 
    [settingsRootView release]; 

    //Configure the animation and modal style, and the navigation bar's color 

    [settingsView.navigationBar setTintColor:kDarkGrayColor]; 

    //Enable the settings flag 
    [self setSettingsIsActive:YES]; 

    //Configure the presentation 
    [settingsView setModalPresentationStyle:UIModalPresentationFullScreen]; 
    [settingsView setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 

    self.settingsViewController = settingsView; 

    [settingsView release]; 
    } 

    //present and release the settings panel 
    [self presentViewController:self.settingsViewController animated:YES completion:^{ 

    }]; 

} 

そして、ここで私はそれを隠す方法は次のとおりです:

ここに私のコードは設定を示すためだが表示

//This method reloads some stuff and 
- (void) dismissSettings{ 

    // 
    // ... Reload some other stuff... 
    // 

    //Dismiss the settings panel 
    [self dismissViewControllerAnimated:YES completion:^{ 

    // 
    // ... Reload some other stuff... 
    // 

    }]; 
} 
+0

あなたにメモリ警告を与えていることを発見しましたか? didReceiveMemoryWarningの中で何かしていますか? – Rob

+0

@Rob - NopeとNope。 – Moshe

答えて

4

は原則的には、メモリの警告は、あなたのビューコントローラに何もしませんが、それは、現在画面上に表示されていないこれらのビューコントローラのビューをアンロードします。あなたの特定のケースで

、私がメインビューコントローラのビューから何かを参照するかもしれないあなたの設定ビューコントローラからのコード上で何かを探します。そうであれば、メモリ警告が発生した後に参照がnilになる可能性があります。

また、あなたが設定を表示することを却下するために必要なことかもしれない何かを処分しているかどうかを確認するために、didReceiveMemoryWarningメソッドの実装を確認する必要があります。メモリ不足の状態で

、それらの「非アクティブ」ビューコントローラからすべてのビューがアンロードされます。 dismissSettingsメソッドがメインコントローラで宣言されているので、呼び出されたときにメインビューのすべての要素がnilである可能性が非常に高いです。私は "Reload some other stuff"コードにどのような操作が含まれているのかわかりませんが、ビューに関連する何かがメソッドを失敗させていると思います。

ビューをロードすることが保証されるため、ビューに関連するすべてのリロードコードをviewDidAppearメソッドに移動することをお勧めします。

一方、実際の設定ビューコントローラでdismissメソッドを実装することをお勧めします(ナビゲーションコントローラを終了する必要があるので、[ self.navigationController dismissModalViewControllerAnimated:YES];のようにしてください)。少なくとも、これはいつも私がこれをしてきた方法であり、決して私を失敗させたことはありません。ロジックは、非アクティブなビューコントローラに任意のロジックを実行させたくないということです。

最後に、あなたがiOS 5以上をターゲットにしていると言えば、プロジェクトをARCに移行することを強くお勧めします。見た目よりも簡単ですし、移動した後は本当に素晴らしいです。

問題の原因としては、通知を使用してdismissメソッドを呼び出していて、メインコントローラがviewDidUnloadメソッドの通知からそのサブスクライブを解除している可能性が考えられます。メモリ不足状態が発生したときに、viewDidUnloadメソッドが呼び出されることに注意してください。

+0

スーパーインプリメンテーション – Moshe

+0

Okを呼び出す以外はviewDidReceiveMemoryWarningメソッドに何もありません。また、設定ビューコントローラにはメインビューコントローラへの参照がありますか?また、おそらくメインビューコントローラからのビューの割り当てが解除されているので、メインビューコントローラからのviewDidUnloadメソッドの内容を確認する必要があります。 – flainez

+0

いいえ、メインビューコントローラへの参照はありません。階層は次のとおりです:メインウィンドウ - >メインビューコントローラ - >設定表示コントローラ – Moshe

0

最初のものが何であるかを見つけることですメモリ警告が発生します。インストゥルメントを使用して、漏れをチェックARCを使用している場合、これは問題になるはずですが、メモリ警告が発生するのは明らかに間違っています。この問題を修正し、問題を修正しました。

つまり、メモリが不足するとOSがアプリケーションをシャットダウンします。バックグラウンドアプリケーションは通常最初に実行されますが、リークが十分に悪い場合、バックグラウンドアプリが終了してから実行中のアプリも終了するまでの時間が短くなることがあります。

関連する問題