UIImagePickerControllerのメモリリーク

はい、タイトルそのままです。
仕事で手がけていたアプリでこの現象に遭遇しました。

具体的には、UIImagePickerControllerを使ったカメラ機能で100枚以上写真を撮り続けているとメモリリークによりアプリがクラッシュするというもので、Appleも認識しているiOSの既知の問題のようです。

通常はアプリがクラッシュするとデバイス上にログが残るのですが、このケースではログが残らないため、原因の特定にかなり手間取りました。幸いにもStack Overflowに同じ現象でハマっている人がいて、それで原因特定のヒントを得ることができました。

UIImagePickerController leaking memory after launch and during taking a picture. Makes app crash after taking more than a 100 pictures

この質問へ回答を寄せた方によると、iOS 10.3.3とXcode 8.3.3で再現するとのことです。僕の場合、iOS 10.3.3とXcode 8.3.3はもちろんのこと、iOS 11.2.6とXcode 9.2でも再現しました。前者より後者のほうが明らかにクラッシュし難くなってるようですが、やはり写真を取り続けているとクラッシュしてしまいます。

ちなみに、Swiftのバージョンは3.2です。

この現象、随分と前から報告されていたみたいですが、現状未対応のようです。アプリを起動して100枚以上写真を撮るケースなんて稀ですし、大抵は起動し直せば済む話なので優先順位が低いのかもしれませんね。

どうしても解決したいという場合は、AVFoundationを用いて地道にカメラ機能を実装するか、もしくは、CocoaPodsで外部ライブラリを使うというところに落ち着きそうです。

UIImagePickerControllerは標準のカメラアプリに近いUIと必要十分な機能で、非常に馴染みやすいものだったので、そう遠くない時期に修正されることを期待します。

Comments