web-dev-qa-db-ja.com

NSUserDefaults同期メソッドを呼び出すことは必須ですか?

誰か、助けてください:NSUserDefaultssynchronize()メソッドの呼び出しは必須ですか?私がそれを呼ばないと、どうなりますか?私のアプリケーションはそれがなくても正常に動作しています。

15
Balagurubaran

いいえ

IOS12以降、必須ではなくなりました。 Apple 言う

この方法は不要であり、使用しないでください。

詳細については、 iOS12リリースノート :を参照してください。

UserDefaults

NSUserDefaultsには、いくつかのバグ修正と改善があります。

同期要件を削除しました。 synchronize、CFPreferencesAppSynchronize、またはCFPreferencesSynchronizeを使用する必要がなくなりました。これらのメソッドは、OSの将来のバージョンで非推奨になります。

これらの同期メソッドを呼び出す必要がなくなったため、NSUserDefaultsユーティリティとPreferencesユーティリティのパフォーマンス特性はわずかに異なります。書き込み操作のエンキューにかかる時間は、同期またはを呼び出す次のスレッドではなく、書き込みスレッドによって支払われるようになりました。読み取り操作を実行します。

20
CoyBit

docs から:

このメソッドは定期的に自動的に呼び出されるため、自動同期を待つことができない場合(たとえば、アプリケーションが終了しようとしている場合)、またはユーザーのデフォルトをディスク上にあるものに更新する場合にのみ、このメソッドを使用してください。変更は加えていません。

つまり、何かがデフォルトに書き込まれた直後に、定期的な間隔でアプリをキャッチせずにアプリを強制終了すると、アプリは失われます。書き込みイベントの直後にアプリを強制終了しなかった可能性があります。そのため、これまでのところアプリは正常に動作しているようです。

14
luk2302

他の人が言っているように、通常は同期を呼び出す必要はまったくありません。

通常、システムはそれを呼び出すので、デフォルトの変更が書き込まれます。

ただし、Xcodeを使用する場合は、コマンドピリオドを押すか、停止ボタンをクリックしてアプリを終了するのが一般的です。その場合、警告なしにアプリが終了し、ユーザーのデフォルトの変更は書き出されない可能性が高く、失われます。

これは、必要に応じて、良いことも悪いこともあります。それは確かに紛らわしいです。

変更を加えるたびに、または一定の時間間隔でsynchronizeを呼び出すことで、これを「修正」できます。ただし、それによってアプリの速度が低下し、所要電力が増加します(どちらもごくわずかです)。ループ状態にある場合は、10,000台のサーバーまたはCore Dataレコードに変更を書き込み、パスごとにユーザーのデフォルトを変更してから、同期後に呼び出します。それぞれがアプリの速度とバッテリー寿命に測定可能な影響を与える可能性があります。ただし、ほとんどの場合、違いに気付くことはほとんどありません。

3
Duncan C

通常は完全に正常に機能し、NSUserDefaultsに書き込んだ直後にアプリが終了する場合など、特別な場合にのみ使用する必要があります。したがって、対応するAppDelegateメソッドに同期メソッドを追加するだけです。

3
matthiaswitt