0

我有一个名为“时间戳”的课程。此类包含一个变量,该变量在第一次使用应用程序打开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 上停止该应用程序是否会将其变为后台模式?

4

2 回答 2

1

您将必须保留以下内容

date = [defaults objectForKey:@"timestampDate"];

应该是

date = [[defaults objectForKey:@"timestampDate"] retain];

由于默认值会返回一个自动释放的对象,我不知道这是否能解决你所有的问题,但这肯定是一个错误

于 2012-06-03T13:17:46.157 回答
0

好的,所以问题不在于我的代码!applicationDidEnterBackground:是我在 Xcode 中停止了应用程序,结果它不会调用date保存到NSUserDefault's. 我认为这不是很好,因为这样就很难测试以保存数据,对吧?所以我找到的最简单的解决方案是同步到NSUserDefaults方法中:viewWillDisappear......我知道用户可能会使用我以前的代码在 iPhone 上看到日期,但最好不要冒险。

于 2012-06-04T09:40:38.070 回答