web-dev-qa-db-ja.com

iOS 10、NSUserDefaultsが機能しない

[NSUserDefaults standardUserDefaults]との間で値の書き込み/読み取りを試みましたが、機能しないようです。私のコードは:

[[NSUserDefaults standardUserDefaults] setObject:@"sampleString" forKey:@"sampleKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSString *defaultsValue = [[NSUserDefaults standardUserDefaults] objectForKey:@"sampleKey"];
return defaultsValue;

このコードは、Xcode 8.0ベータおよびiPhone 6s(10.0)シミュレータの場合、nilを返します。ただし、Xcode 8.0ベータ版およびiPhone 6s(9.1)シミュレータの場合はsampleStringを返します

新しいシステムでアプリをテストしています。私は何か間違ったことをしていますか?それとも回避策はありますか?それとも単なる「ベータ版」の問題ですか?

18
antonio

私は同じ問題を抱えていました。最初にiOS8または9シミュレータを実行し、次にiOS10シミュレータを実行すると、NSUserDefaultsに問題があるようです。 Macを再起動すると問題が解決しました。

25
b_ray

これは、Xcode 8 Beta 1に付属するiOSシミュレータのバグでした。Beta2で修正されました。

Xcode 8ベータ2で解決– IDE

シミュレーター

  • NSUserDefaultsは、以前にiOS 8またはiOS 9シミュレーターを起動したことがあるかどうかに関係なく、iOS 10シミュレーターで正しく機能します。 (25974372)

Xcode 8 Beta 2リリースノート

Xcode 8 Beta 2にアップデートすると、毎回ホストMacを再起動する必要がなくなります。

5
JAL

更新:

データ保護が有効になっている場合、アプリケーションがバックグラウンドに入るときにsynchronizeも失敗する可能性があります。


実際のデバイス iOS 10.1.1を実行しているときにこの問題が発生します。古い値を読み取ることができましたが、新しい変更をディスクに保存できません。synchronizeメソッドは常に失敗します。

デバイスを再起動すると、この問題が解決する場合があります。

3
BB9z

私は同じ問題を抱えていました。 iOS8または9シミュレータを最初に実行し、次にiOS10シミュレータを実行すると、NSUserDefaultsに問題があるようです。 Macを再起動すると問題が解決しました。 shareeditflag確認済み。シミュレーターを閉じて再度開くことはできませんでしたが、再起動すると修正されました。

Apple( Apple link )のように、WWDCシード:複数のiOSシミュレーターを実行すると、NSUserDefaultsが機能しなくなる可能性がありますiOS 8または9シミュレーターを実行してから、iOS 10シミュレーターを実行するとNSUserDefaultsがシミュレータでの動作を停止するこれは、ホストMacを再起動することで回避できます。

1
wg_hjl