使用NSDateFormatter时出现内存泄漏问题

6

我看到很多关于NSDateFormatter内存泄漏的问题/答案,但是没有一篇能帮助我确定什么导致了我的应用程序中的内存泄漏。这是我的代码:

- (id)init
{
    if ((self = [super init])) 
    {
        items = [[NSMutableArray alloc] init];
        events = [[NSMutableArray alloc] init];
        buffer = [[NSMutableData alloc] init];
        format = [[NSDateFormatter alloc] init];
        lastFromDate = @"";
    }
    return self;
}

- (void)presentingDatesFrom:(NSDate *)fromDate to:(NSDate *)toDate delegate:(id<KalDataSourceCallbacks>)delegate
{ 
    [format setTimeZone:[NSTimeZone systemTimeZone]];
    [format setDateFormat:@"MM/dd/yyyy"];
    NSString *stringFromDate = [NSString stringWithString:[format stringFromDate:fromDate]];
    NSString *stringToDate = [NSString stringWithString:[format stringFromDate:toDate]];

    NSLog(@"From date: %@, To date: %@", stringFromDate, stringToDate); 

    [self didDatesChange:stringFromDate];

    if (dataReady) {
        [callback loadedDataSource:self];
        return;
    }
    callback = delegate;
    [self retrieveEventData:stringFromDate to:stringToDate];
}

- (void)dealloc
{
    [items release];
    [events release];
    [buffer release];
    [lastFromDate release];
    [format release];
    [super dealloc];
}

每次我运行"Profile" -> "Leaks"时,都会在该函数调用的行上出现内存泄漏。
NSString *stringFromDate = [NSString stringWithString:[format stringFromDate:fromDate]];

有人能解释一下可能发生了什么吗? 谢谢,迈克。

1
请发布didDatesChange:并检索retrieveEventData:to:。由于您的问题中没有明显的泄漏,我的猜测是其中一个方法内部存在不平衡的保留。 - danh
1
为什么Instruments会指向格式化NSDate的行,如果泄漏是在这些函数中的任何一个中呢? - mike.tihonchik
2个回答

2

提供信息,您可以更改此内容:

 NSString *stringFromDate = [NSString stringWithString:[format stringFromDate:fromDate]];

转换为:

 NSString *stringFromDate = [format stringFromDate:fromDate];

stringWithString应该返回一个自动释放的NSString,所以我不认为这是你泄漏的源头。在我看来,你的代码中没有泄漏。


2
您只需要使用下面的方法获取日期字符串即可,这个方法可以正常工作......
请注意保留原有的html标签。
-(NSString *)StringFromDate:(NSDate *)DateLocal{
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"MM/dd/yyyy"];
    NSString *dateString = [dateFormat stringFromDate:DateLocal];  
    NSLog(@"Date is HERE  =====>> %@",dateString);
    return dateString;
}

当您想获取日期字符串时,请使用以下方式...
NSString *stringFromDate = [self stringFromDate:fromDate]];
[stringfromdate retain];
NSString *stringToDate = [self stringFromDate:toDate]];
[stringTodate retain];

并且在您的viewcontroller.m文件中必须定义-(NSString *)StringFromDate:(NSDate *)DateLocal方法,它可以正常工作...


1
你需要在方法中释放你分配的NSDateFormatter。 - Black Frog
是的,我知道,但现在我只是定义了对用户有用的代码,并在我的应用程序中全局使用dateFormat.....虽然谢谢... :-) - Paras Joshi
1
我在全局定义了NSDateFormatter,因为我不想在每次调用此函数时都创建一个新的。这样会每次重新创建它,对吗?这样做有什么优缺点吗? - mike.tihonchik
1
@ParasJoshi 我尝试了你的解决方案,但在调用stringFromDate:DateLocal的那一行仍然存在内存泄漏问题。 - mike.tihonchik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接