オブジェクトを設定し、同期NSUserDefault
する前にアクセスしようとすると、追加したばかりのオブジェクトにアクセスできますか?
テストするコードを書いてみましたが、知らないうちに同期が行われているかどうかはわかりません。
オブジェクトを設定し、同期NSUserDefault
する前にアクセスしようとすると、追加したばかりのオブジェクトにアクセスできますか?
テストするコードを書いてみましたが、知らないうちに同期が行われているかどうかはわかりません。
はい、アプリケーションsynchronize
の同じ実行セッション中に読み取りサイクルが発生する前に保存されている場合、アプリケーションは保存された設定にアクセスできます。後続のアプリの起動中に情報にアクセスするには、同期が発生する必要があります。
Apple ドキュメントから: NSUserDefaults
NSUserDefaults は、デフォルト値が必要になるたびにユーザーのデフォルト データベースを開く必要がないように、情報をキャッシュします。定期的に自動的に呼び出される synchronize メソッドは、メモリ内キャッシュをユーザーのデフォルト データベースと同期させます。
synchronizeメソッドは、メモリ内キャッシュへの変更をディスク ( の plist ファイルLibrary/Preferences
) に書き込み、変更されていないメモリ内キャッシュをディスク上の最新のキャッシュに更新します。このメソッドは、アプリに通知されることなく定期的に呼び出されます。
再びドキュメントから:[NSUserDefaults synchronize]
説明
このメソッドは定期的に自動的に呼び出されるため、自動同期を待てない場合 (たとえば、アプリケーションが終了しようとしている場合)、またはユーザーのデフォルトをディスク上のものに更新したい場合にのみ、このメソッドを使用してください。何も変更していませんが。
私の経験では、synchronize
アプリケーションが終了するときにメソッドを明示的に呼び出します。これにより、次回の起動時に最新の設定が利用できるようになります。synchronize
ただし、発生する前にアプリケーションがクラッシュするため、設定が保存されないというシナリオにも遭遇しました。アプリケーションは、これらのシナリオを処理できる必要があります。
追加
NSUserDefaults を使用して最小限のデータを保存し、巨大なデータを保存しないでください。理由は、アプリの起動時にアプリのデフォルトが読み込まれるためです。読み込むデータが膨大な場合、アプリの読み込み時間が長くなり、アプリが によって強制終了される可能性がありSpringboard
ます。
の目的は[NSUserDefault synchronize];
、ユーザーの既定値をすぐにディスクに書き込むことです。
これに関して:
知らないうちに同期が行われているかどうかはわかりません。
値を保存するために明示的に呼び出す必要はありません[NSUserDefault synchronize]
。iOS は既に適切なタイミングで呼び出しを行っています (バックグラウンドに移行するときなど)。したがって、その値をすぐに保存したくない場合を除き、その行を避けることができます。実際、値を設定するたびに synchronize を呼び出すと、パフォーマンスの問題になります。