

UserDefaultsに際限なくデータって入れていいものなのでしょうか。Sqliteや、Realmなどに切り替えようか迷ってます。  
データベースに一元管理した方が良さそうですが、既存アプリだとどうしても億劫です。ついつい便利で使ってますが、当然際限なく入れると、どこかでダメになるんだろうなと思ってます。

以下の２点を確認したいです。

  * 最大容量はどの程度
  * 容量増えると、エラーが頻発したり、ロードや書き込みが遅くなるか

UserDefaultsに大量データ入れるとリジェクト喰らうとか、こう言う使い方するとアンチパターンとかありましたら教えてください。  
現状私のアプリでは、シリアライズしたオブジェクトデータ（リストデータ）、イメージオブジェクトなどを入れてます。


CC BY-SA 4.0
2021-10-02T05:20:25.747
82821
2021-10-02T09:31:27.257
2021-10-02T06:26:55.120
3060
48360
question
swift ios xcode
UserDefaults に格納できるデータ容量の上限は？


> UserDefaultsに際限なくデータって入れていいものなのでしょうか。

よくはないです。

> Sqliteや、Realmなどに切り替えようか迷ってます。

iOS標準で使用できるCore
Dataが入っていないのはなぜ?ちなみにSQLiteを直接コードから使用するのは生産性も低くバグも入りやすいためあまりお勧めできません。

>   * 最大容量はどの程度
>

Appleのドキュメントとしてはこんなものがあります。

[`sizeLimitExceededNotification`](https://developer.apple.com/documentation/foundation/userdefaults/1617187-sizelimitexceedednotification)

> Currently, there is only a size limit for data stored to local user defaults
> on tvOS, which posts a warning notification when user defaults storage
> reaches 512kB in size, and terminates apps when user defaults storage
> reaches 1MB in size.

(現状ではtvOSにだけサイズの制限があります、とのこと。)

> 容量増えると、エラーが頻発したり、ロードや書き込みが遅くなるか

  * 「頻発」については、どの程度で頻発と考えるのかによるので少し離れますが、「UserDefaultsに大量のデータを入れすぎたせいでアプリがクラッシュする」的な記事は探すと見つかります。

[NSUserDefaults Crash](https://developer.apple.com/forums/thread/112829)

この記事の場合は、「処理に時間がかかるんでアプリをkillしたら、起動時にアプリがクラッシュするようになった」と述べています。

  * 「ロードや書き込みが遅くなるか」については、Yesです。

例えば、UserDefaultsの動作の詳細について調べた上で書かれたこんなブログ記事があります。

[UserDefaults Limitations and
Alternatives](https://jeffreyfulton.ca/blog/2018/02/userdefaults-limitations-
and-alternatives)

(代表的なものでわかりやすくまとまっているのであげましたが、似たような記事は他にもいくつも見つかると思います。きちんと調べた上で書いている記事ならどれもほぼ同じ内容・結論です。)

  * UserDefaultsはまとめて1つのplistファイルに保存されている
  * 当然それがでかくなれば読み込みにも時間がかかる  
(plistは、たった1件のデータが欲しい時にもファイル全部を読み込む必要がある)

  * 当然それがでかくなれば書き込みにも時間がかかる  
(plistは、たった1件のデータを更新する時にもファイル全部を書き換える必要がある)

  * 一旦読み込んだplistファイルはメモリにキャッシュされるので、メモリも圧迫する

大量のデータをUserDefaultsに保存することに良いところはありませんね。

* * *

> UserDefaultsに大量データ入れるとリジェクト喰らうとか、こう言う使い方するとアンチパターンとかありましたら教えてください。

リジェクトは喰らわなくてもUserDefaultsに大量データを入れると言うこと自体が典型的なアンチパターンです。初心者向けのプログラミング入門記事ならともかく、きちんとした本格的なアプリでそんなことをしてはいけません。

上に挙げたブログ記事では、UserDefaultsを使うべき場合について、以下のようにまとめています。

  * UserDefaults is best used for persisting very small user preference type data which needs to be restored from backup.
  * Anything else should be stored in the appropriate directory depending on how long the data is needed and whether or not it can be regenerated or re-downloaded.

(「UserDefaultsってのは、設定画面の設定項目(user
preference)のような少量のデータを永続化するのに向いている」「他のあらゆるものは、その特性を考慮して適切なディレクトリに保存すべし」)

以前は、AppleのDeveloper
ForumsでAppleの技術者からほぼ同じ内容のレスが付くことも多かったのですが、最近はあまりにも不適切なUserDefaultsの使い方をしているような質問が減ってきているせいか、リンクは拾い出せませんでした。

> 現状私のアプリでは、シリアライズしたオブジェクトデータ（リストデータ）、イメージオブジェクトなどを入れてます。

これは私自身の私見、私が仕切れるアプリ開発での判断基準ですが、

  * シリアライズしたオブジェクトデータ（リストデータ）

イエローカード、ユーザが任意の個数を溜め込めるようなデータの場合(ユーザが長くアプリを使い続ければ、すぐに数千・数万とデータが膨らんでいくようなもの)は、UserDefaultsには入れない

  * イメージオブジェクト

レッドカード、画像のように1件だけでもサイズが大きくなるデータは決してUserDefaultsには入れない

と言った感じです。ご参考まで。


CC BY-SA 4.0
2021-10-02T09:31:27.257
82824
2021-10-02T09:31:27.257
13972
82821
answer