如何解决这种潜在的内存泄漏问题?

时间:2011-07-20 12:46:12

标签: objective-c xcode memory-leaks

我是目标c的新手,我不明白这里是否有内存泄漏:

MessageCustomCell *cell = [[MessageCustomCell alloc] initAutoreleaseWithLine:currentLine AndId:message.UID];
[[cell dateTime] setText:[formatter stringFromDate:message.Date]];
[[cell from] setText:message.From];
[[cell play] setTitle:@">" forState:UIControlStateNormal];    
[formatter release];   
return cell;

在返回牢房上;分析仪表示存在“在207行分配并存储到单元格中的对象的潜在泄漏”。这是分配单元格的行,但我正在返回单元格,这是怎么回事? 在此先感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

基于名称的问题是,您试图在init函数中返回自动释放的对象。静态分析器假设以init开头的实例方法将所有权返回给调用者(增加保留计数),即使您将其称为initAutorelease。对于以new开头的方法也是如此。在更改名称之前,您将继续获取分析器警告,但您要执行的操作需要是该类的便捷方法。

//Signature
+(id)cellWithLine:(int)line andId:(NSString*)mid;

//Sample Call
[MessageCustomCell cellWithLine:currentLine andId:message.UID];

答案 1 :(得分:0)

return [cell autorelease];

另外,您正在发布格式化程序。

答案 2 :(得分:0)

在修复潜在泄漏之前,我们需要知道什么是保留和释放。保留是分配内存,释放是释放内存。

NSstring * str = [[NSstring alloc] init]; 这里我们将内存分配给'str'变量。在同一个.m文件中,我们需要在完成其功能后释放变量的内存。 简单写入代码[str release]; 它不会导致任何内存泄漏。

答案 3 :(得分:-1)

除非您的方法名称以“new”开头(如在newMessageCell中),“alloc”或包含“copy”,否则返回的对象应该是一个自动释放的对象。您的代码返回引用计数为1的对象,并且行为良好的调用者不会将其减少超过该值。如果呼叫者希望保留该小区以获得它的所有权,它将会这样做。

要修复此泄漏,只需自动释放细胞。