iOS アプリにメモリの問題があり、それについていくつか質問があります。
まず第一に、私は iOS 6 で作業しており、ARC を使用しています。
今、私の状況を説明しましょう:
私は2つのビューを持っています。最初のビューから、ボタンをタップすると、2 番目のビューを ( and を使用alloc
してinit
) 作成し、次のコードを使用してモーダルとして表示します。
[self presentViewController:secondView animated:YES completion:^{
[secondView prepareToDraw]; // Function I use to start my computations and rendering
}];
ある時点で、計算が終了したら、2 番目のビューを閉じて最初のビューに戻りたいと思います。私は2番目のビューからこのコードを使用しています:
[self dismissViewControllerAnimated:YES completion:^{
[self finished]; // Function I use to free some malloc
}];
Instruments Allocations と Leaks を使用してアプリケーションを実行していますが、Leaks はありません。
これが私のコードですdidReceiveMemoryWarning
:
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
if ([self isViewLoaded] && ([[self view] window] == nil)) {
self.view = nil;
[self tearDownGL];
if ([EAGLContext currentContext] == self.context) {
[EAGLContext setCurrentContext:nil];
}
self.context = nil;
}
// Dispose of any resources that can be recreated.
NSLog(@"Resources freed");
}
このtearDownGL
関数は、テクスチャ、頂点配列などの OpenGLES リソースを解放します...
アプリケーションを実行すると、最初のビューと 2 番目のビューを何度か切り替えた後、メモリ警告が表示され、アプリケーションがクラッシュします。
ここに私の質問があります:
1-アプリケーションは、コントローラーの UIImage、UIView などを自動的に解放していますか? そうでない場合、ARC を使用しているため、どうすればそれらを解放できますか? 関数も見ましたviewDidUnload
が、ドキュメントにあるように非推奨です:
コントローラーのビューがメモリから解放されたときに呼び出されます。(iOS 6.0 では廃止されました。メモリ不足の状態でビューが消去されなくなったため、このメソッドが呼び出されることはありません。)
しかし、メモリ不足の状態でビューがパージされなくなった場合、アプリケーションのクラッシュを防ぐためにメモリを解放するにはどうすればよいでしょうか? 私は何をすべきか?
2-didReceiveMemoryWarning
2 つのコントローラーの関数にブレークポイントを設定しました。シミュレーターでアプリケーションを実行すると、メモリ警告がシミュレートされます。didReceiveMemoryWarning
が2 つのコントローラーに対して 1 回呼び出されていることがわかります。しかし、最初のコントローラーと 2 番目のコントローラーを数回切り替えるとdidReceiveMemoryWarning
、最初のビュー コントローラーに対しては 1 回呼び出されますが、2 番目のビュー コントローラーに対しては数回呼び出されます。3 回切り替えると、関数は 3 回呼び出されます。したがって、2 番目のビューを「閉じて」最初のビューに戻ると、2 番目のビューは解放されず、まだ存在していると思います。なんで ?どうすれば強制的に破棄できますか? (もう使用せず、新しいものを作成するので)関数で2番目のView Controllerを作成し、それへの参照を保持しません(クラスに保存されません)。