如何使用NSUserDefaults正常工作(检索值)

时间:2009-03-02 19:17:36

标签: iphone objective-c cocoa cocoa-touch

我的代码中有一个简单的方法,如下所示:

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

这样做的目的是转到Settings包,并从PSTextFieldSpecifier中检索一个值。如果我手动进入并添加一些任意文本,代码将按预期工作。但是,每当我第一次在新设备上安装应用程序时,第一个条件就是执行为false,这应该是真的。单步执行代码后,gdb证明该对象确实是零:

(gdb)po t_gName
(空)

我在这里做错了什么?为什么第一次安装应用程序并且t_gName是空/空PSTextFieldSpecifier时条件失败。我甚至尝试在我的设置包中添加一个空字符串中的DefaultValue。

2 个答案:

答案 0 :(得分:15)

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

这会产生如下内容:

@"(null)"

因此既不nil也不等于@""

顺便说一下

  1. 您根本不需要stringWithFormat:
  2. 请勿检查string == nil,而是!string
  3. 您不必检查空字符串,因为有一个字符集或nil
  4. 使用比t_gName更好的名称,短名称没有理由。
  5. 像这样:

    - (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 :(得分: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
        }
    }