2012-01-17 8 views
4

私は自分のAppDelegateの中に以下のコードを書いていますが、私が再びアプリケーションを起動すると、値がまだ(NULLではなく)保存されていることがわかります。何故ですか?NSUserDefaultsは-applicationWillTerminateで書かれています。どうして?

コード:

- (void)applicationWillTerminate:(UIApplication *)application 
{  [[NSUserDefaults standardUserDefaults] 
     setObject:NULL forKey:@"roomCat"]; 
     [[NSUserDefaults standardUserDefaults] 
     setObject:NULL forKey:@"TFA"]; 
     [[NSUserDefaults standardUserDefaults] 
     setObject:NULL forKey:@"comments"]; 

} 

ありがとうございました。

答えて

9

あなたは-removeObjectForKey:を使用して代わりにNULLを設定する必要があります。前者は値を削除する正式な方法であり、後者は文書化されていない行為です。 -removeObjectForKey:を使用して動作しない場合はどのような場合には

、あなたが最後に

[[NSUserDefaults standardUserDefaults] synchronize]; 

に呼び出しを追加することができます。しかし、もしそれがなければそれがうまくいかない場合にのみそれをしてください。なぜなら、-synchronizeを呼び出すのは(比較的)高価なので、正確性を確保するために必要な場合にのみ行う必要があるからです。


もう一度見てみると、このメソッドがまったく呼び出されていないというのが本当の問題だと思います。 iOS 4以降では、アプリがバックグラウンドに入ると、このメソッドは呼び出されず、代わりに-applicationDidEnterBackground:が呼び出されます。代わりにこのコードを入れてみてください。

+0

私は今iPhoneを充電していますが、シミュレータでコードを試しましたが、コードが実際のデバイスで動作することを期待して変更することはありません。 –

+2

@ Bobj-C:私の編集した答えを見てください。それはおそらく全く呼び出されていないでしょう。ちなみに、なぜあなたのアプリが終了したときにユーザーのデフォルトを削除していますか? 'NSUserDefaults'の全体的なポイントは、アプリケーションの起動間で設定を維持することです。 –

+0

@KevinBallard優秀な答えは、これは間違いなく動作するはずです。私はまた、なぜあなたが離れる前にそれらを拭きたいと思うのか理解していません。それは意味をなさない。 :\ – Telinir

3

この場合、NSUserDefaultsの同期メソッドをこのメソッドの最後の行として手動で呼び出して、アプリケーションが終了する前に同期させる必要があると思います。

+1

iOS 4以降では、「applicationWillTerminate:」は非常にまれにしか呼び出されません。 "applicationDidEnterBackground:"を使用する方が良いでしょう。 :) – Telinir

0

は、代わりにこの方法を試してみてください。

- (void)removeObjectForKey:(NSString *)defaultName 
0
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 


if (prefs) 
{ 

    [prefs setObject:NULL forKey:@"roomCat"]; 
    [prefs synchronize]; 
} 
関連する問題