【问题标题】:Memory Leak while using NSDateFormatter使用 NSDateFormatter 时出现内存泄漏
【发布时间】:2012-04-20 21:47:13
【问题描述】:

我在 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]];

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

【问题讨论】:

  • 请发布 didDatesChange: 和 retrieveEventData:to:。由于您的问题中的代码没有明显的泄漏,我的猜测是其中一种方法内部的不平衡保留。
  • 如果泄漏发生在其中一个函数中,为什么 Instruments 会将我指向格式化 NSDate 的行?

标签: iphone objective-c nsdateformatter


【解决方案1】:

仅供参考,您可以更改此设置:

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

到这里:

 NSString *stringFromDate = [format stringFromDate:fromDate];

stringWithString 应该返回一个自动释放的 NSString,所以我不相信这是你泄漏的来源。对我来说,您的代码似乎没有泄漏。

【讨论】:

    【解决方案2】:

    您只需使用以下方法从日期获取字符串即可正常工作......

    -(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];
    

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

    【讨论】:

    • 你需要释放你在方法中分配的NSDateFormatter。
    • 是的,我知道,但现在我只是定义了对解决问题的用户有用的代码,我在我的应用程序中全局使用 dateFormat .....尽管谢谢... :-)
    • 我在全局范围内定义了 NSDateFormatter,因为我不想每次调用这个函数时都创建一个新的。这会每次都重新创建它,对吗?这样做有什么优点/缺点吗?
    • @ParasJoshi 我试过你的解决方案,仍然在调用 stringFromDate:DateLocal 的地方出现内存泄漏。
    猜你喜欢
    • 2011-12-02
    • 2013-07-19
    • 1970-01-01
    • 2013-11-09
    • 2013-11-02
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多