2017-01-20 4 views
5

私はちょうど私の**NSUserDefaults** に存在するキーがnilを頻繁に返すことに気づいた。 の半分くらいに見えますが、残りの半分はそうではありません。私は半分の時間を言うが、私は そのフリップフロップ、その40~50%私はそれが動作しない参照してください意味しない。 初期値を書き込むとすぐに同期が呼び出されます。 私は新しいユーザーがサインアップするときにアプリケーション リビジョンとしてこのキーを使用します。NSUserDefaults objectForKey時折nil

次のコードは、nilを返します。

#define kDBrevision @"revision" 

NSString *rev = [[NSUserDefaults standardUserDefaults] objectForKey:kDBrevision]; 

私はアプリを起動し、ちょうど( はどんなNSUserDefaultsを記述することなく)値を監視する場合、値は時々、すべてのNSUserDefaultsへの変更なしで有効 です。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSString *r = [[NSUserDefaults standardUserDefaults] objectForKey:kDBrevision]; 
    NSLog(@"revision %@", r); 
    _exit(1); 

なぜこのようなことが起こっているのかわかりません。私の デバイスがiOS 10をXcode 8.2.1に接続しています。誰でもアイデアはありますか? おかげ

編集:私はこれを修正についてアップルに話し始め、あなたが ファイル保護を完全にオンになっている場合、それは時々現れて、この問題 の原因となることを見出し 、しかしAppleは語りました私の特定の ケース(これは私が今確信していた唯一のものです)はバグです。 Xcodeを使ってデバイス上でアプリを起動すると、 はこのように失敗しないことがあります。いつかわからない場合は を修正してください。その代わりに、重要な文字列を既定値から キーチェーンに移動しました。

+1

おそらくあなたがあなたの 'NSUserDefault'にnilの値を保存する場合は、コード内で間違った半分の時間で正しい半分の時間のようなものは、その唯一のあなたのコードに、ありませんチェックする必要があります – Tj3n

+0

設定中に[[NSUserDefaults standardUserDefaults] synchronize]が見つかりませんでしたか? – KSR

+0

私はnilを書いていないことを確認しました。そして、私が新しい価値を書くとき、私はsyncrhonizeを呼び出します。 – Tim

答えて

5

これはXcode 8および/またはiOS 10バグのようです。実際にキーのデータがあったときに、私はそれを自分で実行し、UserDefaultsに断続的にnilを返すようにケースを限定的に絞り込んだ。具体的には、データを一度設定してから、セットロジックを削除し、getロジックのみを繰り返し実行し、時には値を取得することもあります。

リリース構成を使用するようにRun Schemeを変更し、デバッガを接続せずにデバイス上でアプリケーションを実行すると、問題がなくなりました。すなわち、実行ロジックが正しい値を生成するたびに(約30回)発生しました。ここで

は、いくつかのより多くの議論です:

iOS 10 with XCode 8 GM caused NSUserDefaults to intermittently not work

iOS 10, NSUserDefaults Does Not Work

https://forums.developer.apple.com/thread/48700

https://forums.developer.apple.com/message/143155#143155

0

はdidFinishLaunchingWithOptions

にコードの下にしてみてください

スイフト30

UserDefaults.standard.synchronize() 

Obective - C

[[NSUserDefaults standardUserDefaults] synchronize]; 
関連する問題