NSDateFormatter导致僵尸问题

时间:2011-03-10 08:05:43

标签: iphone ios memory-management nsdateformatter

我总是遇到一些问题让臭名昭着的NSDateFormatter导致代码中的内存不稳定。我一定不能理解如何正确使用它。我看过大量的示例代码并在此之后建模我的方法,但似乎内存问题仍困扰着我。我遇到的问题是这种方法正在创造一个僵尸 - 不太确定如何/为什么。一些见解会很精彩!!

-(NSString *)getTimeZoneFormatedDate:(int)subtractMinutes TimeZoneOffset:(NSString *)timeZoneOffset
{
    float timeZoneOffsetInt = [timeZoneOffset floatValue];

    //Calculate the requested UTC time
    NSDate *UTCDateTimeNow = [NSDate date];
    NSDate *UTCDateTimePast = [UTCDateTimeNow dateByAddingTimeInterval:((subtractMinutes*60)+(timeZoneOffsetInt*60*60))];

    //Round the minutes down
    NSDateComponents *time = [[NSCalendar currentCalendar]
                              components:NSHourCalendarUnit | NSMinuteCalendarUnit
                              fromDate:UTCDateTimePast];
    int minutes = [time minute];
    float minuteUnit = floorf((float) minutes / 10);
    minutes = minuteUnit * 10;

    //Format the minutes string
    NSString *minuteString;
    minuteString = [NSString stringWithFormat:@"%d",minutes];
    if ([minuteString length] < 2) 
        minuteString = [@"0" stringByAppendingString:minuteString];

    //Format the rest of the date & time
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    NSDateFormatter *dateFormatter;
    dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setDateFormat:@"yyyy-MM-dd, HH:"];
    NSString *yearMonthDayHourString = [dateFormatter stringFromDate:UTCDateTimePast];

    //Put the two together and return it!
    return [yearMonthDayHourString stringByAppendingString:minuteString];
}

我正在实施它:

        NSString *timeZoneText = [self getTimeZoneFormatedDate:minuteModifier*-10 TimeZoneOffset:radarTimeZoneOffset];

如果我使用dateformatter注释掉我的项目并且我的方法刚刚返回:

return @"blah blah";

没有问题 - 一切都没有错误。所以,我认为可以安全地假设问题在于!谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

您可以尝试NSDateFormatter的getObjectValue:forString:range:error:方法。也许返回NSError为你提供了一个合理的解释,为什么它失败了。

另一方面,可能有一种更简单的方法来获得结果:

    NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"dd-MMM-yyyy HH:mm:ss"];
    NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    [dateFormatter setLocale:usLocale];
    [usLocale release];  
    return [dateFormatter stringFromDate:date];

答案 1 :(得分:0)

我认为问题是你的“NSString * yearMonthDayHourString”是自动释放的字符串。 您可以将其保留在类似

的实现代码中

self.timeZoneText = blabla如果timeZoneText属性为retain 或者只是[timeZoneText保留];然后释放;