NSDate是1-1-2001

时间:2012-06-03 13:07:03

标签: objective-c ios nsdate

我有一个名为" 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上停止该应用程序将其转换为后台模式?

2 个答案:

答案 0 :(得分:1)

您必须保留以下内容

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

应该是

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

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

答案 1 :(得分:0)

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