1

NSUserDefaults に約 50MB の NSData オブジェクトを保存することが悪い考えである理由はありますか?

ドキュメントには何もありませんが、NSUserDefaults が使用されているのを見ると、通常はかなり少量のデータです。ファイルに保存するよりもNSUserDefaultsに保存するほうが簡単だと思うので、できれば利用したいです。

4

4 に答える 4

1

アプリのNSUserDefaultsドメインは、XML プロパティ リストとしてディスクに書き込まれます。XML plist に NSData が含まれている場合、データは 16 進数のテキストで表されます (読みやすいように空白を追加)。データの各バイトは 2 文字のテキストになるため、50 MB のデータは 100 MB になります。

さらに、プロパティ リストはランダム アクセス ファイルではありません。ユーザー (またはこの場合は Apple の の実装NSUserDefaults) がディスク上のプロパティ リストの値を読み取りたい場合、ファイル全体が読み取られ、解析されてNSDictionary. 変更を加えてディスクに保存したい場合は、ディクショナリ全体がシリアル化され、ファイルに書き出されます。したがって、読み取りと解析、またはシリアル化と書き込みは、1 kB ファイルよりも 100 MB ファイルの方がはるかに時間がかかります。これは、アプリのライフサイクル全体で何度も発生する可能性があるため、ユーザー(または Apple のフレームワークの一部のコード。NSUserDefaults内部的に使用される場合があるため) を呼び出すたびに発生します。-[NSUserDefaults synchronize]

すでに NSData を持っている場合、それを自分でファイルに入れるのは難しくありません。-[NSData initWithContentsOfFile:]それ-[NSData writeToFile:atomically:]が目的です。(さらに、アプリの docs ディレクトリで読み取り/書き込み用のパスを取得するのに 1、2 行しかかかりません。いくつかの例については、Xcode プロジェクト テンプレートを参照してください。)

于 2012-04-05T20:18:07.930 に答える
1
  1. NSUserDefaults はオブジェクトをプロパティ リストとして格納するため、バイナリ形式ではなくテキスト (XML) 形式の plist を使用する可能性があります。この場合、NSData は ints 記述をファイルに送信しますが、これは実際のサイズの 2 倍の大きさです。実際には、データの 16 進数表現 (およびスペース パディングなど) であるためです。

  2. その場合、概念的に誤用/乱用されます。ユーザーのデフォルトは、まあ、ユーザーのデフォルトです。つまり、ファイル全体ではなく、設定/設定を保存するために使用する必要があります。これは、ファイル処理 API (C stdio 関数、NSFileHandle など) のタスクです。

お役に立てれば。

于 2012-04-05T19:57:54.640 に答える
1

50 MB のバイナリ データをプロパティ リストとの間で変換するのは非常に効率が悪いからです。そのような場合、直接ファイル IO が唯一の適切な選択です。

于 2012-04-05T19:58:03.117 に答える
0

また、ユーザーのデフォルトにアクセスする他のアプリケーションは、100 MB の読み取りと解析に時間を費やさなければなりません。

于 2012-04-05T20:23:49.773 に答える