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