iPhone错误,'引用计数对象在发布后使​​用错误';内存泄漏清理

时间:2011-01-17 20:47:25

标签: iphone objective-c ios4 memory-leaks release-management

我正在尝试清理现有iPhone应用中的内存泄漏和其他问题。我对Objective C有点新,但是有一些很好的编程基础知识和对开发iphone应用程序时所需的内存管理的一般理解。我的问题是关于以下方法。

  -(NSDate *)formatDate:(id)value{
NSLog(@"eja: DetailViewController/ formatDate()");

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"];
[dateFormatter release];


return [dateFormatter dateFromString:value];


}

返回错误读取“引用计数对象在发布后使​​用”。我看到dateFormatter在返回/使用之前被释放。问题当然是如果你在return语句之后放置一个版本,你会得到一个与dateFormatter var声明相关的'潜在的对象泄漏'错误。

我也试过“autorelease”

return [[dateFormatter dateFromString:value] autorelease];

但是我接到错误'对象发送 - 自动释放太多次'。

有关如何正确编写此内容的任何建议,以便正确管理变量?

3 个答案:

答案 0 :(得分:2)

您可以在发布NSDate

之前创建NSDateFormatter
-(NSDate *)formatDate:(id)value
{
    NSLog(@"eja: DetailViewController/ formatDate()");

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"];
    NSDate *date = [dateFormatter dateFromString:value];
    [dateFormatter release];

    return date;
}

这样,当你返回的对象不需要手动内存管理时,你分配的NSDateFormatter就会被释放。

答案 1 :(得分:2)

替换

[dateFormatter release];

[dateFormatter autorelease];

它应该有效!

答案 2 :(得分:0)

您可以自动发布它,而不是编写[dateFormatter release],甚至可以在此过程中保存一行代码。

- (NSDate *)formatDate:(NSString *)value {
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"];
    return [dateFormatter dateFromString:value];
}