NSUserDefaultsで適切に動作する(値を取得する)方法
-
03-07-2019 - |
質問
次のような単純なメソッドがコードにあります:
- (BOOL)isFirstTimeLogin
{
NSString *t_gName =
[NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:kGroupIdentifierKey]];
if ([t_gName isEqualToString:@""] || t_gName == nil) {
DLog(@"LoginViewController, m:::isFirstTimeLogin, First time login happening.");
return YES;
}
DLog(@"LoginViewController, m:::isFirstTimeLogin, Not a first time login.");
return NO;
}
これが行うことは、単に設定バンドルに移動し、PSTextFieldSpecifierから値を取得することです。手動で任意のテキストを追加すると、コードは期待どおりに機能します。ただし、新しいデバイスにアプリを最初にインストールするときは常に、最初の条件はfalseとして実行されますが、これはtrueである必要があります。コードをステップ実行した後、gdbはオブジェクトが実際にnilであることを証明します:
(gdb)po t_gName
(null)
ここで何が間違っているのでしょうか?アプリが初めてインストールされ、t_gNameが空/ null PSTextFieldSpecifierであるときに条件が失敗するのはなぜですか。空の文字列の設定バンドルにDefaultValueを追加しようとさえしました。
解決
[NSString stringWithFormat:@"%@", nil];
これにより、次のようなものが作成されます。
@"(null)"
であり、 nil
でも @""
でもありません。
ところで
-
stringWithFormat:
はまったく必要ありません。 -
string == nil
をチェックせず、!string
をチェックする
- 1つのセットがあるか、または
nil
であるため、空の文字列をチェックする必要はありません。 -
t_gName
よりも適切な名前を使用します。短い名前の理由はありません。
これに似ています:
- (BOOL)isFirstTimeLogin
{
NSString *groupIdentifier = [[NSUserDefaults standardUserDefaults]
objectForKey:kGroupIdentifierKey];
if (!groupIdentifier) {
DLog(@"First time login.");
return YES;
}
DLog(@"Not a first time login.");
return NO;
}
他のヒント
これを試してください:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedFirstTime"])
{
// app already launched
NSLog(@"app already launched");
}
else
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedFirstTime"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"First Time");
// This is the first launch ever
}
}
所属していません StackOverflow