

お世話になっております。漠然とした質問になってしまい恐縮ですが、次のような問題の相談をチームの人から受けて返答に窮しております。

「100MBを超えるデータをメモリに持つと、iOSがプロセスをすぐにkillする」

こうなることを防ぐために自分で調べた結果、次のような対応をすればよいらしいとわかりました。

  * UIViewControllerのdidReceiveMemoryWarningメソッド内で適切に不要なビューを開放する（nilを代入する？）
  * AppDelegateのapplicationDidReceiveMemoryWarning内でモデルなどVC以外で使用しているメモリのうち不要なものを開放する
  * UIApplicationDidReceiveMemoryWarningNotification通知を受け取り適切に対処する

参考：メモリ効率の向上に
関するガイドライン（<https://developer.apple.com/jp/documentation/MemoryUsage.pdf>）

また、GitHubでソースコードを見られるアプリのコードを見たのですが、  
あまりメモリ管理が原因でiOSからkillされる状況に対処してあるアプリは多くありませんでした。

# 質問点

これ以外の点でiOS側からプロセスを止められないためにすべき対策があればご指摘くださると幸いです。今までiOSのプログラムを書いていて、あまりそのようなケースにあたったことがなく、また入門書などでもあまり見ない話題です。

なお、その相談してきた人の作っているアプリはカメラから画像を取得して処理するものです。画像のマッチングなどに多量のデータをメモリに持つ必要があるとのことです。

よろしくおねがいします。


CC BY-SA 3.0
2017-01-15T01:26:11.800
31854
2017-01-15T11:15:05.533
14631
question
ios メモリ管理
iOSで大きなデータを処理するアプリにおけるメモリ管理の注意点


100MB超のデータというのがどういうものなのか、どこで何をやってる時に Kill されているのかがわからないので、大量データをループで処理している最中に
Kill されるというケースについてのお話です。  
大量のデータをループで処理されるような場合、ループ内の処理を「autoreleasepool ブロックで囲む」のが定石かと思います。  
使用言語が ObjCなのかSwiftなのかわからないのですが、ObjCなら

[code]

    while true {
        @autoreleasepool {
            // 処理
        }
    }
    
[/code]

Swift なら

[code]

    while true {
        autoreleasepool {
            // 処理
        }
    }
    
[/code]

です。


CC BY-SA 3.0
2017-01-15T11:02:11.937
31870
2017-01-15T11:15:05.533
2017-01-15T11:15:05.533
13521
13521
31854
answer