nibnameなしでViewControllerをinitするとiOS8だけでクラッシュする

配信したアプリがログイン後に落ちたりスプラッシュで落ちたりする、という報告を受けて、自分のところでは起きていなかったのでなんだろうと思って調べたら、画面の初期化時に読み込んでいるカスタムViewControllerのinitが間違っていて、しかもそれでもiOS9は動くためだった。

対応するnibを持つSubViewControllerを、

override func viewDidLoad() {

self.subVC = SubViewController()
}

と引数なしで生成すると、iOS9ではnibを探してロードしてくれるようで(ちゃんと調べてないけどそうなんだと思う)問題ないんだけど、iOS8は読み込まれないのでOutletのオブジェクトに触ろうとするとクラッシュする。

override func viewDidLoad() {

self.subVC = SubViewController(nibname: “SubViewController”, bundle: nil)
}

と正しく初期化すると問題ない。

swift - addSubview from xib - iOS 8 vs iOS 9 - Stack Overflow

あと、

iOS8系をサポートするなら、UILabelやUITextViewのフォントにHiraginoSansは使わないほうが良い - Qiita

  • Xcode7でiOS8系をサポートしたアプリを作成するときに、Interface Builder上(xibやstoryboard)で UILabel やUITextView のフォントに HiraginoSans を利用するViewControllerを作成すると、その画面ヘの遷移が遅くなる
    • 体感では、1つの HiraginoSans フォントを利用したUIパーツを配置する毎に1秒弱ずつ遅くなる
    • 現象が発生するのはアプリ初回起動時のみ
  • これはフォントに依存する問題で、System FontやTimes New Romanなど他のフォントを利用すると再現しなかった

こんな恐ろしい情報もあったので全部のUILabelのフォントを再設定した。


Realmを使ってみる

Realm is a mobile database: a replacement for SQLite & Core Data

新しいiOSアプリのデータストアはRealmを使ってみることにした。過去のiOS開発だとCoreDataを使ったりSQLite+FMDBを使ったりしていて、CoreDataは二度と使いたくない感じだったし、SQLiteは初期データを入れたDBファイルを使うプロジェクトでは便利だったけど今回はそういう要件もないので新し目の技術にした。

で触ってみているけどこれはだいぶ便利なのではないだろうか。なにがいいってモデルと別にスキーマを管理しなくていいとこがいい。永続化されるデータをほぼモデルそのものと考えることができる。APIも(RealmSwiftだと)rubyライクというか、まっとうなSwiftライブラリだということかもしれないけど、納得感が高い。

ひたすらありがたいなこれはーと思いながら実装している。