NSUserDefaults не записывается на диск - PullRequest
2 голосов
/ 13 ноября 2009

Я установил некоторые значения в 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 ]

13 голосов
/ 13 ноября 2009

Добавление следующего кода после внесения необходимых изменений решило проблему:

[ [NSUserDefaults standardUserDefaults] synchronize];
1 голос
/ 21 мая 2010

NSuserDefualts не сохранял мои значения при сбое игры. с помощью
[ [NSUserDefaults standardUserDefaults] synchronize]; Вейлы спасаются.

1 голос
/ 13 ноября 2009

Чтобы узнать, сколько стоит, вы можете посмотреть значения по умолчанию в Редакторе свойств, чтобы убедиться, что они написаны правильно:

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

или просто сбросьте их:

defaults read org.your.app
...