我正在尝试清理现有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];
但是我接到错误'对象发送 - 自动释放太多次'。
有关如何正确编写此内容的任何建议,以便正确管理变量?
答案 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];
}