Objective c NSLog打印带有错误的NSString

Objective c NSLog打印带有错误的NSString,objective-c,nsstring,nslog,Objective C,Nsstring,Nslog,我一直在玩弄日期格式,并提出了一个简单的测试,看看它是否按预期工作。它创建了一系列日期,从当前开始,每次迭代15分钟后返回。然后测试输出格式化日期和实际日期数据进行比较: - (void)testDateFormatting { NSDate *date; NSDateFormatter *formatter = [NSDateFormatter new]; [formatter setLocale:[NSLocale localeWithLocaleIdentifi

我一直在玩弄日期格式,并提出了一个简单的测试,看看它是否按预期工作。它创建了一系列日期,从当前开始,每次迭代15分钟后返回。然后测试输出格式化日期和实际日期数据进行比较:

- (void)testDateFormatting {

    NSDate *date;

    NSDateFormatter *formatter = [NSDateFormatter new];
    [formatter setLocale:[NSLocale localeWithLocaleIdentifier:@"ru_RU" ]];
    [formatter setDateFormat:@"HH:mm EE dd.MM"];

    for (NSUInteger i = 0; i < 500; i++) {

        NSTimeInterval time = - (60.0 * i * 15);
        date = [NSDate dateWithTimeIntervalSinceNow:time];

        NSString *formattedDateString = [SCRBDateFormatter stringFormattedToXAgoFromDate:date];

        NSLog(@"%@ - %@", formattedDateString, [formatter stringFromDate:date]);

        XCTAssert(formattedDateString, @"TEST_ERROR: stringFormattedToXAgoFromDate: returned nil.");
    }

}
当然,输出应该是相同的。我不确定是什么原因造成的。好像打印的字符串在印刷过程中被改变了。我认为所有这些方法都是同步的。知道去哪里找吗

实际的应用程序似乎并没有这个问题,它们只在测试中出现

这是格式化代码。我知道现在它的优化非常糟糕,有很多返回语句,这不是重点

+ (NSString *)stringFormattedToXAgoFromDate:(NSDate *)date {

    NSString *result = nil;

    static NSCalendar *calendar = nil;

    if (!calendar) {
        calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
    }

    NSTimeInterval timeGap = [[NSDate date] timeIntervalSince1970] - [date timeIntervalSince1970];

    if (timeGap < 0) {
        NSLog(@"SCRB_ERROR: scrb_formatDateToXTimeAgoString: cannot format date. Date argument is later than current date.");
        return nil;
    }

    NSDateComponents *components = [calendar components:NSCalendarUnitMinute | NSCalendarUnitHour | NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitSecond | NSCalendarUnitYear fromDate:date toDate:[NSDate date] options:0];

    static NSDateFormatter *formatter = nil;

    if (!formatter) {
        formatter = [NSDateFormatter new];
        NSLocale *_ruLocale = [NSLocale localeWithLocaleIdentifier:kRuLocaleIdentifier];
        [formatter setLocale:_ruLocale];

    }


    if (timeGap < 60) {

        result = @"ТОЛЬКО ЧТО";
        return result;

    }

    if (timeGap < 60*60) {

        result = [NSString stringWithFormat:@"%td МИН. НАЗАД", components.minute];
        return  result;

    }

    if (timeGap < 60*60 * 5) {

        result = [NSString stringWithFormat:@"%td Ч. НАЗАД", components.hour];
        return  result;

    }


    if (timeGap < 60*60 * 24 * 2) {

        if ([calendar isDateInToday:date]) {

            [formatter setDateFormat:@"HH:mm"];
            result = [formatter stringFromDate:date];
            return result;

        } else if ([calendar isDateInYesterday:date]) {

            return @"ВЧЕРА";

        }
    }

    if (timeGap < 60*60*24 * 7) {

        [formatter setDateFormat:@"EEEE"];
        result = [[formatter stringFromDate:date] uppercaseString];
        return result;

    }

    if (components.year < 1) {

        [formatter setDateFormat:@"dd MMM"];
        result = [[formatter stringFromDate:date] uppercaseString];
        return result;

    }

    if (components.year >= 0) {

        [formatter setDateFormat:@"dd.MM.YYYY"];

        result = [formatter stringFromDate:date];
        return result;

    }

    return result;
}
这个在循环中

[array addObject:formattedDateString];

以及测试结束时的断点。数组中的字符串没有日志中显示的任何错误

显示
scrb\u formatDateToXTimeAgoString
@trojanfoe的实现如果我在发帖时搞砸了一点,你提到的方法是
stringFormattedToXAgoFromDate:
,对我来说,最大的谜团是为什么每个日志语句开头的时间戳顺序不正确。您发布的所有代码都是同步的。你有可能在两个不同的线程上进行两个测试吗?@rmaddy是的,我也觉得很奇怪。我实际上是在运行一个测试(通过直接按它)。我发现了一些新信息,请参见更新2。显示
scrb\u formatDateToXTimeAgoString
@特洛伊木马的实现。我在发表文章时有点搞砸了,你提到的方法是
stringFormattedToXAgoFromDate:
,最大的谜团是为什么每个log语句开头的时间戳都是无序的。您发布的所有代码都是同步的。你有可能在两个不同的线程上进行两个测试吗?@rmaddy是的,我也觉得很奇怪。我实际上是在运行一个测试(通过直接按它)。我发现了一些新信息,请参见更新2。
 NSMutableArray *array = [NSMutableArray new];
[array addObject:formattedDateString];