代码之家  ›  专栏  ›  技术社区  ›  Ilya Suzdalnitski

nsuserdefaults未写入磁盘

  •  2
  • Ilya Suzdalnitski  · 技术社区  · 15 年前

    我将一些值设置为nsuserdefaults,如果不退出应用程序就检索到这些值,一切正常。 当我重新启动应用程序时,95%的时间内更改都会消失。在5%的时间内,一切都保存完好。

    我第一次面对这个问题。在我的其他应用程序中,我通常不会将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];
    }
    

    谢谢。

    3 回复  |  直到 12 年前
        1
  •  13
  •   Ilya Suzdalnitski    15 年前

    在进行必要的更改后添加以下代码解决了问题:

    [ [NSUserDefaults standardUserDefaults] synchronize];
    
        2
  •  1
  •   nall    15 年前

    对于它的价值,您可以使用属性编辑器查看您的默认值,以查看它是否正确写入:

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

    或者只是把它们扔掉:

    defaults read org.your.app
    
        3
  •  1
  •   SNR    13 年前

    nsuserdefualts没有在游戏崩溃时保存我的价值观。 通过使用,
    [ [NSUserDefaults standardUserDefaults] synchronize]; 山谷正在被拯救。