我是目标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行分配并存储到单元格中的对象的潜在泄漏”。这是分配单元格的行,但我正在返回单元格,这是怎么回事? 在此先感谢您的帮助!
答案 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的对象,并且行为良好的调用者不会将其减少超过该值。如果呼叫者希望保留该小区以获得它的所有权,它将会这样做。
要修复此泄漏,只需自动释放细胞。