web-dev-qa-db-ja.com

SwiftでdidReceiveMemoryWarningを実装する方法は?

新しいView Controllerサブクラスを作成するたびに、Xcodeは自動的にメソッドを追加します

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated
}

通常、私はそれを削除するか無視します。これは、私が見たすべてのチュートリアルでも行うことです。しかし、私はXcodeが毎回それを私に与えるので、それはいくぶん重要であると思いますよね?ここで何をすべきですか?リソースの破棄とは、nilに設定することを意味すると思いますが、「再作成可能なリソース」とは正確には何ですか?

私はこれらの質問を見ました:

しかし、それらはすべてPre-Swiftです。 Objective-Cについてはあまり知りませんが、メモリ管理が異なると聞きました。 didReceiveMemoryWarningですべきことにどのように影響しますか?

その他の注意事項:

  • 自動参照カウントと遅延インスタンス化を曖昧に認識しています
  • 私が見つけたdidReceiveMemoryWarningの-​​ ドキュメント はかなり短いものでした。
31
Suragch

Swift

SwiftはObjective-Cと同じようにARCを使用します( source to Apple Docs )。メモリの解放には同じ種類の規則が適用され、オブジェクトへのすべての参照を削除します。そして、割り当てが解除されます。

メモリを解放する方法

リソースの破棄とは、nilに設定することを意味すると思いますが、「再作成可能なリソース」とは正確には何ですか?

「再作成可能なリソース」は、実際にアプリケーションに依存します。

あなたはたくさんの写真を扱うソーシャルメディアアプリだとしましょう。すばやくスクロールできるように、メモリ内の次の20枚の写真をキャッシュするために、きびきびしたユーザーインターフェイスが必要です。これらの画像は常にローカルファイルシステムに保存されます。

  • 画像は多くのメモリを占有する可能性があります
  • メモリ内にこれらの画像は必要ありません。アプリのメモリが不足している場合は、ファイルから画像をロードするのに1秒余分に時間がかかります。
  • そのメモリ警告を受け取ったら、イメージキャッシュを完全にダンプできます。
  • これにより、システムに必要なメモリが解放されます

さまざまなレベルの素晴らしいゲームを作成しています。ファンシーゲームエンジンにレベルを読み込むには時間がかかるため、ユーザーが十分なメモリを持っている場合、レベル2をプレイしている間にレベル3を読み込むことができます。

  • レベルは多くのメモリを占有します
  • 次のレベルのメモリは必要ありません。彼らは持っているのはいいが必須ではない。
  • LevelCache.sharedCache().nextLevel = nilはすべてのメモリを解放します

割り当てを解除してはいけないもの

画面上にあるものの割り当てを解除しないでください。関連する質問に対するいくつかの回答を見ましたが、UIViewControllerのビューの割り当てを解除しました。画面からすべてを削除すると、クラッシュする可能性があります(私の意見では)。

ユーザーが編集中のドキュメントを開いている場合は、割り当てを解除しないでください。アプリが保存されずに作業内容を削除すると、ユーザーは非常に怒ってしまいます。 (実際には、それが発生した場合に備えて、おそらく何らかの緊急保存メカニズムが必要です)

ユーザーがすばらしいソーシャルメディアアプリの投稿を書いている場合、その仕事を無駄にしないでください。保存して、再度アプリを開いたときに復元してみてください。セットアップするのは大変ですが、これを行うアプリが大好きです。

注意

最新のデバイスのほとんどがメモリ不足になることはめったにありません。システムは、バックグラウンドでアプリを強制終了して、フォアグラウンドで実行中のアプリのメモリを解放するという非常に良い仕事をします。おそらく、アプリを初期状態に開いたアプリをタップしたときに、アプリスイッチャーでアプリが「開いている」ことをご存じでしょう。 OSはメモリを解放するためにバックグラウンドでアプリを強制終了しました。この問題を回避する方法については、 State Restoration を参照してください。

大量の処理を行っていないときにアプリに一貫したメモリ警告が表示される場合は、最初にメモリリークが発生していないことを確認してください。メモリリークの検出は、この回答の範囲外です。 ドキュメント および チュートリアル

37
Kevin

didReceiveMemoryWarningが呼び出されると、アプリが使用しているメモリが多すぎることを意味し(デバイスのメモリと比較)、release any additional memory used by your view controllerアプリのメモリを削減します。メモリアプリがデバイスのメモリを超えると、iOSはすぐにアプリを強制終了します。 「再作成可能なリソース」とは、どこかで再作成できるものを意味します。現在は必要ありません(メモリに保存する必要はありません)。そして、didReceiveMemoryWarningを取得したときに解放できます。

別の詳細トピックを次に示します。 iosアプリの最大メモリバジェット

3
tuledev