モデルオブジェクトのプロパティgetterメソッドと同名のメソッドを作り込んでいるとRealmの初期化時にアプリが固まる

ちょっと前まで動いていた開発中のアプリが突然スプラッシュで固まるようになってしまい、Realmの初期化でなにかトラブルが起きることは把握したけど理由がぜんぜんわからず、あせってPodのアップデートをしたり過去のリビジョンと比較したり大騒ぎしてしまったんだけど、原因はRealmのモデルオブジェクトクラスに作っていたメソッドの名前を何の気なしにリネームしたら、それがモデルのRealmで永続化されるプロパティのgetterと衝突しており、そのせいでRealmを起動できず固まるという状態になっていた。

ドキュメントには「モデルクラスのsetterおよびgetterメソッドはオーバーライドできません」とは書いてあるけどそんな致命的な状態になるのはなんか別の原因があったのかな。Objective-Cそのもののgetter/setterの挙動で同じようにハマったこともあったような…ともかくあせった。


RealmがiPhone実機でだけクラッシュする(ことがあるらしい)

iOS開発が佳境で、そろそろ結合テストというタイミングのころ、iPhoneのいくつかの実機でだけアプリが起動直後にクラッシュするという現象が起きた。当該機種でもシミュレータでは再現しないし、手持ちの端末実機でも再現しない。しょうがないのでその機種を借りにいってその場で調べたら確かにクラッシュしてて、なにかと思ったらjsonファイルでバンドルしているマスタデータを初回起動時にまとめてインサートしてるとこで

json.forEach { v in
let master = Master()
try relam.write {
master.import(v)
}
}

的なコードで個別にトランザクションを張ってデータを入れてたら機種によっては(手持ちのiPhone5だと大丈夫でiPhone6だとだめだったりしたので、パフォーマンスの問題なのかも)クラッシュしてしまうらしかった。トランザクションをループの外で張るようにしたら大丈夫になった。ただあとでバグなら報告しようと思って後で戻して再度実行したらクラッシュしなくなってたのでなにか別の要因もあるのかも。

Realm使い心地としてはかなり最高だし次のプロジェクトでも絶対導入したいけど、初期データを投入したDBファイルを作っておくみたいなことはしにくいのはなんとかならないかな。