株式会社Nanameue
iOSエンジニアのbatiです
Objective -CからSwiftに乗り変えて2か月。
今は新規プロジェクトをPure Swift でやっている状況で、
そろそろ、Swift最高じゃんもうObjective-Cには戻れないわ
と感じている頃です。
さて今日の本題ですが、なんて刺激的なタイトルなんでしょう。
しかし僕はこの目で見てしまいました
NSUserDefaultsの値が勝手に消え失せる現象を!!!!!
なんてFantasticな現象でしょう
僕の仮説ではこれはiOS側のバグだと考えられます。(iOS9.3にアップデートした瞬間起き始めたので)
僕の端末でしか確認できてませんが、もし同じ現象の人がいたら是非情報共有しましょう
具体的な現象
- Facebook,Line,SmartNewsを開くたびに、ログイン画面、会員登録画面になる
- 僕が会社で開発しているアプリでもNSUserDefaultsに保存していたデータがアプリをKillするたびに、勝手に消える
- ログを出力してみたら、保存したデータではなくnilが返ってきた
- もう一回ビルドしてみたら、nilではなくきちんと保存したデータが帰ってきた
- この現象は1時間に1回ほどのペースで起きた
考えられる原因
1時間ほどググった結果、NSUserDefaultsはMainスレッドで実行されなければ正しく動かないことがわかりました。
しかし、NSUserDefaultsはスレッドセーフです。
わざわざ、スレッドを変えなくても、大丈夫なはず!!
なんですが、事実として原因と考えられるものはこれしか見つかりませんでした
一応NSUserDefaultsに保存できる上限があるのですが、それはiPhoneのストレージ分なので、
上限に達したというのは考えにくいです
実際に、Mainスレッドで強制的に呼ぶコードを書いたら、その現象は二度と起きなくなりました
本当に不思議ですね、、
僕の仮説だと、アップデートでスレッドが呼ばれるタイミングなどが
少しバグってしまったのでは???
と考えています。
同じ現象が起きる人がもしいたら是非共有しましょう
またこちらも合わせてどうぞ