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の設定はあったが、修正時には直接関係していないので割愛
発生手順
- アプリ内でCustomTextFiledにタップしてキーボードを呼び出す (inputViewにxibから生成したViewを渡しているので実際にはキーボードではない)
- キーボードが出ている状態で、Homeボタンを押してアプリをバックグラウンドにする
- アプリを選択してフォアグラウンドにする
- 2〜3を繰り返し、バックグラウンドに以降せず画面がフリーズしたら再現できた状態で、一度フリーズすると端末を強制的再起動(電源とHomeボタンの同時長押し)しか復帰しない
解決した方法
inputView用のxibに含まれている特定のUIViewを削除したら直った。
このUIView自体は背景色として使用しているだけで、IBOutletで繋いだり、CustomClassだったりしない普通のUIViewだった。
なので、なぜフリーズの温床になったかがわからない。
クラッシュならまだ調査使用があるが、フリーズは調査が難しいため、
似たような状態になったとき、表示している画面のパーツを1つ削除してはテストして…と試すと解決することがあるかもしれない。