Xcodeでアプリ開発中に落ちる原因は端末容量不足とメモリリーク
カメラアプリを作っていたところ、特定のボタンを押すとMacBook AirとiOS端末の実機との接続が分断される現象が続いて、何かなと思ったらメモリ圧迫が理由であることがなんとなくわかってきた。
Contents
Lost connectionとなる原因はケーブルの接触不良だけでない
iPhoneやiPad等の実機でアプリをテスト動作させていると、よく次のようなメッセージが生じます。
Lost connection to “da-yasu の iPad”.
Restore the connection to “da-yasu の iPad” and run “MaskCam” again, or if “MaskCam” is still running, you can attach to it by selecting Debug > Attach to Process > MaskCam.
まあこれは、私のケーブルの中身が微妙にねじれて断絶されているのかどうかわからないんですけど、MacBook AirとiPad miniとを接続するケーブルの接触不良が原因であることがほとんどで、これまでも、ケーブルの位置とか端末の位置とかを色々と慎重にセットして接続不良が解消されたらこういうエラーは生じなかったのです。
が、どうも、カメラアプリを作成中、ある特定のボタンを押下する際に必ずこのエラーでアプリが落ちるという初めての体験をしました。
画面上のボタンを押したことで端末とケーブルの物理的な位置関係が微妙にずれたことでケーブルの接続がおかしくなったのかな、と思って、端末を動かさないように微妙なバランスを保ったまま慎重にボタンを押してもやはりアプリが落ちる。
そしてデバッグエリアに表示されるこのメッセージ。
2016-11-26 05:41:35.774 MaskCam[1544:178511] Received memory warning.
これはアプリのメモリが圧迫されたことでアプリが落ちているということか。
というわけで調査をしてみる。
まずはInstrumentsでアプリ動作中にどの程度のCPUを使っているか、メモリリークは起きているか等を確認。
メニューバーで「Xcode」-「Open Developer Tool」-「Instruments」を起動。
項目に「Time Profiler」、「Leaks」、「Allocations」など適当に選択してアプリ起動をすると、結構メモリリークしている。
leak checksでは周期的にチェックが入っているし、CPUもパルス状にマックス近くになったりしている。
All Heap & Anonymous VMは定常的にMax状態。
一見、かなり端末がフル稼働していて大変な感はあるのだけど、実際のところこれがどれくらい深刻なものなのかわからない。
というのも、これまで普通に使っていて落ちるほどにメモリを圧迫するような複雑なアプリを作った試しはないからであった。
そして使っているといきなりInstrumentsが落ちて次のようなメッセージが出る。
Instrumentsが予期しない理由で終了しました。
アプリケーションを再度開く場合は、“再度開く”をクリックしてください。詳細を確認してAppleにレポートを送信する場合は、“レポート”をクリックしてください。
なんか多分やばいのだろう。
次にDebug navigatorで確認。
これもまあどの程度深刻なのかようわからんのだけど、ボタン押下時にCPUが90%超えるし、Memoryに関してはそのうち100MBを超えたりする。
で、そのうち落ちると。
カメラアプリは容量をたくさん使う
それで自分が考えたことは、今回「UIImagePickerControllerDelegate, UINavigationControllerDelegate」あたりを使っていて、画像処理のために顔画像認識をしたいからCIDetector()なんかも使っている。
これは結構容量を使うのではなかろうか。
そしてswift3,Xcode8の環境がiOS 10で使うことを想定されており、このiOSを使える端末の性能が上がってきているから、私のような初代iPad miniでテストしようとすると、もはやカメラアプリを使うのに耐えきれない。
という想定をしている。
objective-cで書いた時は別に落ちることはなかったし、swiftの方が処理が早いから最新のswiftを使ったからといってそれ自体を理由にメモリを圧迫するようなことはないと思うのだけど。
メモリ解放もちゃんとやっているとは思うのだけどなあ。
解決法
というわけで解決法はよくわからなくて、単純に、「もうiPhone 4とか初代iPad miniとかを実機に使うような状況でアプリ開発をするのは限界」という気がしてきた。
だいたい、iPhone4はiOS8にすら対応してないし、初代iPad miniもiOS10に対応できなくなった。
iOS10のテスト環境で検証しないとエラーが発生することもあるので、もはや新しいiPhone買わないと無理。
そろそろiPhone5Sでも中古で買うか。