面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

iOS9系のiPadで不可解なフリーズ現象

iOS9系のiPadで不可解なフリーズ現象に遭遇し、原因はわからないものの解消することができたので、
今後同じことに遭遇した時のために、備忘録として記載。
最小限のテストプロジェクトで試してみたが、再現できなかった。

発生した条件

  • iOS9のiPad端末(ただしiPad Pro 12.9inch以外)
  • Simulatorでは発生しない
  • Objective-C(Swiftで発生するか不明)
  • アプリ内で、UITextFieldを継承したクラスを作成(仮にCustomTextFiledとする)
  • CustomTextFiledのクラス内でinputViewとinputAccessaryViewのメソッドをオーバーライドしている
  • 上記メソッドの返り値としてxibで生成したinputViewとinputAccessaryViewを返している
  • xibはAutolayoutやSizeClassesを使用していない
  • その他、delegateやIBOutletの設定はあったが、修正時には直接関係していないので割愛

発生手順

  1. アプリ内でCustomTextFiledにタップしてキーボードを呼び出す (inputViewにxibから生成したViewを渡しているので実際にはキーボードではない)
  2. キーボードが出ている状態で、Homeボタンを押してアプリをバックグラウンドにする
  3. アプリを選択してフォアグラウンドにする
  4. 2〜3を繰り返し、バックグラウンドに以降せず画面がフリーズしたら再現できた状態で、一度フリーズすると端末を強制的再起動(電源とHomeボタンの同時長押し)しか復帰しない

解決した方法

inputView用のxibに含まれている特定のUIViewを削除したら直った。
このUIView自体は背景色として使用しているだけで、IBOutletで繋いだり、CustomClassだったりしない普通のUIViewだった。
なので、なぜフリーズの温床になったかがわからない。

クラッシュならまだ調査使用があるが、フリーズは調査が難しいため、
似たような状態になったとき、表示している画面のパーツを1つ削除してはテストして…と試すと解決することがあるかもしれない。