如何正确地使用NSUserDefaults(检索值)?

3

我在代码中有一个简单的方法,看起来像下面这样:

- (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证明了对象确实为空:

(gdb) po t_gName
(null)

我可能做错了什么?为什么条件在应用程序首次安装时失败,t_gName是一个空/ null PSTextFieldSpecifier?我甚至尝试在我的设置中心中添加一个空字符串的DefaultValue。

2个回答

15
[NSString stringWithFormat:@"%@", nil];

这将创建类似于以下内容的东西:

@"(null)"

因此它既不是nil,也不等于@""

顺便说一句

  1. 你根本不需要使用 stringWithFormat:
  2. 不要检查 string == nil,而应该检查 !string
  3. 你不必检查空字符串,因为已经有一个字符串被设置为空或者它是nil
  4. 使用比 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;
}

1

试试这个:

 -(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
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接