2013年1月18日に修正。データベースについても言及。

データを保存したい場合、NSUserDefaults、ファイル、データベース(SQLite)、どれにするかで悩むかもしれません。そこで自分なりの判断基準をまとめておきたいと思います。

※ あくまで自分個人の判断基準なので参考までにお願いします。

NSUserDefaultsが適している場合

NSUserDefaultsへ保存するデータは、サイズが小さいものが望ましいと思います。NSUserDefaultsを通じて保存したデータも、もちろんファイルに保存されます。それは1枚のXMLファイルです。

1枚のファイルということは、保存する項目が多かったり、1項目に大きなデータを保存すると、パフォーマンスが落ちる可能性があります。またXMLへ変換するため、バイナリデータとしてファイル保存するよりもCPUコストがかかる場合もあるでしょう。

保存するデータが非オブジェクトであるとき

たとえば、intやBOOL、floatといったプリミティブな型で表現されるデータはNSUserDefaultsが適していると思います。ただし、あまりに項目数が多い場合はファイルやデータベースへ逃す方法を考えたほうが良さそうです。

保存するデータが小さいオブジェクトである時

小さいオブジェクトであればNSDataに変換してNSUserDefaultsへ保存して良いと思います。
関連記事: NSCoder、NSKeyedArchiverでデータを保存する

具体例

  • 設定画面で設定するアプリケーションの種々の設定
  • アカウントやユーザーの基本情報(名前やアクセストークンなど)

こういったものの多くはintやBOOLといった型で表現されるものだと思います。また全部合わせても100項目以下で収まるのではないでしょうか?それならばNSUserDefaultsへの保存が適していると思います。

関連記事: NSUserDefaultsへデータを保存する【実践編】

ファイルが適している場合

NSUserDefaultsとは逆にデータサイズが大きいものや、読み書き頻度が高いものはファイルで保存したほうが良いと思います。

具体例

  • 画像などのバイナリデータ
  • アカウントやユーザーにひもづくサイズが大きいデータ
  • キャッシュデータのように読み書き頻度が高いもの

こういったデータはクラス化して、NSCodingプロトコルの実装と、NSKeyedArchiverを使って、NSDataへ変換しファイルへ保存するようになっているとスマートです。

関連記事: NSCoder、NSKeyedArchiverでデータを保存する

データベースが適している場合

保存したデータを条件指定して取り出したい場合は、データベースにするのが望ましいです。SQLite3を使うのが定番です。そのままSQLite3のライブラリを使うと面倒なので、FMDBなどのライブラリなどを使うとよいでしょう。

メモアプリで1枚のメモごとにタグをつけるような仕様の場合は、データベースに保存しておくとタグ検索も容易に実装できます。自前でファイルで実装するより確実でコストも低いでしょう。

UserDefaultsとファイル保存の組み合わせ

アカウントやユーザーにひもづくデータが大きい場合などは、

  • NSUserDefaultsへ基本情報とファイルデータへの参照情報を保存
  • アカウントデータとひもづくデータをファイルで保存

という組み合わせにしておくと良いかと思います。

以下の様な仕様でアカウントデータを保存するとします

  • アカウント数は上限5人まで登録できる
  • アカウントのデータは、ユーザー名、ユーザーのプロフィール、ユーザーの画像(大、中、小)

NSUserDefaultsへ保存する内容

  • ユーザー名
  • ユーザーのプロフィール
  • ユーザーの画像のファイル名(ハッシュ値で生成)

ファイルへ保存する内容

  • ユーザーの画像大(ハッシュ値_large.png)
  • ユーザーの画像中(ハッシュ値_medium.png)
  • ユーザーの画像小(ハッシュ値_small.png)

アカウントを削除した時は対応する画像ファイルも削除することを忘れないようにする必要があります。