読者です 読者をやめる 読者になる 読者になる

Skyland Ventures tech ブログ

渋谷のVenture Capital Skyland Venturesのいま一番イケてる投資先、nanameue,IncとKaumoの共同技術ブログ

気をつけろ!NSUserDefaultは消えるぞ!

株式会社Nanameue iOSエンジニアのbatiです Objective -CからSwiftに乗り変えて2か月。 今は新規プロジェクトをPure Swift でやっている状況で、 そろそろ、Swift最高じゃんもうObjective-Cには戻れないわ と感じている頃です。

さて今日の本題ですが、なんて刺激的なタイトルなんでしょう。 しかし僕はこの目で見てしまいました NSUserDefaultの値が勝手に消え失せる現象を!!!!! なんてFantasticな現象でしょう

僕の仮説ではこれはiOS側のバクだと考えられます。(iOS9.3にアップデートした瞬間起き始めたので)

僕の端末でしか確認できてませんが、もし同じ現象の人がいたら是非情報共有しましょう

具体的な現象

  • Facebook,Line,SmartNewsを開くたびに、ログイン画面、会員登録画面になる
  • 僕が会社で開発しているアプリでもNSUserDefaultに保存していたデータがアプリをKillするたびに、勝手に消える
  • ログを出力してみたら、保存したデータではなくnilが返ってきた
  • もう一回ビルドしてみたら、nilではなくきちんと保存したデータが帰ってきた
  • この現象は1時間に1回ほどのペースで起きた

考えられる原因

1時間ほどググった結果、NSUserDefaultはMainスレッドで実行されなければ正しく動かないことがわかりました。 しかし、NSUserDefaultはスレッドセーフです。 わざわざ、スレッドを変えなくても、大丈夫なはず!!

なんですが、事実として原因と考えられるものはこれしか見つかりませんでした

一応NSUserdefaultに保存できる上限があるのですが、それはiPhoneのストレージ分なので、 上限に達したというのは考えにくいです

実際に、Mainスレッドで強制的に呼ぶコードを書いたら、その現象は二度と起きなくなりました

本当に不思議ですね、、

僕の仮説だと、アップデートでスレッドが呼ばれるタイミングなどが 少しバクってしまったのでは???

と考えています。

同じ現象が起きる人がもしいたら是非共有しましょう