2009-11-12 85 views
2

我设置了一些值NSUserDefaults,如果我没有退出应用程序检索他们,一切工作正常。 当我重新启动应用程序时,这些更改在95%的时间内消失。在5%的时间内,一切都被保存好了。NSUserDefaults没有被写入磁盘

我第一次遇到这个问题。在我的其他应用程序中,我通常不会将NSString保存在NSUserDefaults中。可能保存NSString的事实会导致问题?

这里是我的代码:

-(void) mayShowFeedbackMessage 
    { 
    NSDateFormatter *dateFormatter = [ [NSDateFormatter alloc] init]; 
    [dateFormatter setTimeStyle: NSDateFormatterLongStyle]; 
    [dateFormatter setDateStyle: NSDateFormatterMediumStyle]; 

    if ([ [NSUserDefaults standardUserDefaults] objectForKey: @"ratingsMessage_shown_on_date"]) 
    { 
      NSString *lastRatingDateString = [ [NSUserDefaults standardUserDefaults] 
              objectForKey: @"ratingsMessage_shown_on_date"]; 
      NSDate *lastRatingDate = [dateFormatter dateFromString: lastRatingDateString]; 

      DebugLog(@"lastRatingDateString: %@", lastRatingDateString); 
      DebugLog(@"time since last message: %.0f", [ [NSDate date] timeIntervalSinceDate: lastRatingDate]); 

      if ([ [NSDate date] timeIntervalSinceDate: lastRatingDate] >= 120.0f) 
      { 
       [self showFeedbackMessage]; 

       NSDateFormatter *dateFormatter = [ [NSDateFormatter alloc] init]; 
       [dateFormatter setTimeStyle: NSDateFormatterLongStyle]; 
       [dateFormatter setDateStyle: NSDateFormatterMediumStyle]; 

       NSString *dateString = [dateFormatter stringFromDate: [NSDate date] ]; 
      [dateFormatter release]; 

      [ [NSUserDefaults standardUserDefaults] setObject: dateString 
                 forKey: @"ratingsMessage_shown_on_date" ]; 

      lastRatingDateString = [ [NSUserDefaults standardUserDefaults] 
            objectForKey: @"ratingsMessage_shown_on_date"]; 
      DebugLog(@"new date: %@", lastRatingDateString); 

     } 
    } 
    else 
    { 
     NSDateFormatter *dateFormatter = [ [NSDateFormatter alloc] init]; 
     [dateFormatter setTimeStyle: NSDateFormatterLongStyle]; 
     [dateFormatter setDateStyle: NSDateFormatterMediumStyle]; 

     NSString *dateString = [dateFormatter stringFromDate: [NSDate date] ]; 
     [dateFormatter release]; 

     [ [NSUserDefaults standardUserDefaults] setObject: dateString 
                 forKey: @"ratingsMessage_shown_on_date" ]; 

     NSString *lastRatingDateString = [ [NSUserDefaults standardUserDefaults] 
               objectForKey: @"ratingsMessage_shown_on_date"]; 
     DebugLog(@"new date: %@", lastRatingDateString); 

    } 

     [dateFormatter release]; 
} 

感谢。

回答

13

做必要的修改后添加以下代码解决该问题:

[ [NSUserDefaults standardUserDefaults] synchronize]; 
+0

从10.8及更高版本开始,这不应该是必需的:https://developer.apple.com/library/mac/releasenotes/CoreFoundation/CoreFoundation.html“[Synchronization]现在几乎在所有情况下都是自动的。剩下的唯一理由就是如果你需要一个独立的进程来访问你刚刚设置的值;例如,如果您设置了首选项,那么...另一个进程...读取相同的首选项。大多数普通应用程序永远都不需要这样做,而鼓励使用进程间通信API(例如XPC)的应用程序......而不是使用IPC的首选项系统。“ – 2013-10-08 00:35:55

1

对于它的价值,你可以看看你的默认值与属性编辑器,看它是否被正确写入:

open ~/Library/Preferences/org.your.app.plist 

或者只是把它们扔掉:

defaults read org.your.app 
1

NSuserDefualts没有SAVIN g我的游戏崩溃值。 使用,
[ [NSUserDefaults standardUserDefaults] synchronize]; 价值正在得到保存。