我有一个名为" Timestamp"的课程。此类包含static NSDate
变量,该变量使用应用程序打开的NSUserDefaults
首次初始化。此日期将变为稍后使用的字符串。这是我第一次配置日期:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *string = [defaults objectForKey:@"timestampCheck"];
if (!string) {
Timestamp *tstamp = [[Timestamp alloc] init];
[tstamp setSingleTimeStamp : [NSDate date]];
[tstamp release];
[defaults setObject:@"notFirst" forKey:@"timestampCheck"];
[defaults synchronize];
} else {
Timestamp *ti = [[Timestamp alloc] init];
[ti initializeTimestamp];
[ti release];
}
initializeTimestamp
方法只是从默认值中检索时间戳。这是在名为synchronizeTimestamp
当应用进入后台状态时调用该方法。
Timestamp类如下所示:
- (void)setSingleTimeStamp:(NSDate *)dateProvided {
date = dateProvided;
[date retain];
}
- (void)synchronizeTimestamp {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:date forKey:@"timestampDate"];
[defaults synchronize];
}
- (void)initializeTimestamp {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
date = [defaults objectForKey:@"timestampDate"];
}
- (NSString *)dateStringContainer {
NSDate *tempDate = date;
unsigned units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:units fromDate:tempDate];
NSInteger year = [components year];
NSInteger month = [components month];
NSInteger day = [components day];
return [NSString stringWithFormat:@"%i - %i - %i", day, month, year];
}
单独视图控制器中的标签文本设置为dateStringContainer
。当然,当我删除并构建我的应用程序时,它会显示正确的日期。但是当我退出应用程序并从多任务栏中删除标签文本时:
1 - 1 - 2001
在date
NSLog's
为零
更新:
好的,基本上,当我的应用程序插入时,应用程序第一次打开时我的日期正常工作(我必须每次都删除应用程序)。但是当我从应用程序中删除后再回到它多任务栏,日期不正确。这意味着我的NSUserDefaults
代码有问题吗?猜猜......
编辑:
我注意到我的synchronizeTimestamp方法没有被调用。但这可能是因为我在Xcode上停止应用程序,是否在Xcode上停止该应用程序将其转换为后台模式?
答案 0 :(得分:1)
您必须保留以下内容
date = [defaults objectForKey:@"timestampDate"];
应该是
date = [[defaults objectForKey:@"timestampDate"] retain];
由于默认值将返回自动释放的对象, 我不知道这是否能解决你所有的问题,但这肯定是一个错误
答案 1 :(得分:0)
好的问题不在于我的代码!是我在Xcode中停止了应用程序,结果不会调用applicationDidEnterBackground:
date
保存到NSUserDefault's
的位置。我认为这不是很好,因为那么很难测试保存数据吗?所以我找到的最简单的解决方案是同步到方法中的NSUserDefaults
:viewWillDisappear
...
我知道用户可能会使用我之前的代码在iPhone上看到日期,但最好不要冒这个风险。