【问题标题】:How to fix this potential memory leak?如何修复这种潜在的内存泄漏?
【发布时间】:2011-10-09 09:06:24
【问题描述】:

我是 Objective 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 行分配并存储到单元格中的对象的潜在泄漏”。这是分配单元格的行,但我要返回单元格,所以这是怎么泄漏的? 提前感谢您的帮助!

【问题讨论】:

标签: objective-c xcode memory-leaks


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    return [cell autorelease];
    

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

    【讨论】:

      【解决方案3】:

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

      要修复此泄漏,只需自动释放单元即可。

      【讨论】:

      • 谢谢你修复它。但是,在 MessageCustomCell 初始化中,我调用了 [self autorelease]。这还不够吗?
      • "除非您的方法名称以 "new" 开头(如在 newMessageCell 中),否则返回的对象应该是自动释放的对象。 ——哇,真的没有。 -alloc...-copy... 也都返回非自动释放的对象。这个问题的解决方案(自动释放单元对象)是正确的,但你的答案的第一句话将产生一千个内存泄漏。
      • @Dan 很好。我匆忙写下答案,省略了这两个。我的错。我已经编辑了答案。
      【解决方案4】:

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

      //Signature
      +(id)cellWithLine:(int)line andId:(NSString*)mid;
      
      //Sample Call
      [MessageCustomCell cellWithLine:currentLine andId:message.UID];
      

      【讨论】:

      • 不幸的是,在静态方法中,我不能使用 currentLine 和 message.UID 来设置稍后需要的一些实例变量。虽然我更喜欢在初始化时设置自动释放,但更重要的是设置实例变量。
      • @Alex 在静态方法中你创建一个实例,如果你的实例变量没有公开暴露你可以通过->访问它们
      • 除非我误解了你,否则为了成功,我需要将 MessageCustomeCell 的关系从 UITableViewCell(接口 MessageCustomCell:UITableViewCell)更改为具有 UITableViewCell 实例变量。我项目的当前结构无法实现。
      • 你误会我了,你想要创建的是一个方便的构造函数。 MessageCustomCell 将有一个静态方法来分配和初始化它自己的一个实例并返回一个自动释放的值。这样静态分析器很高兴,你会得到你想要的结果。这是一个简单的例子forums.macrumors.com/showthread.php?t=1084240
      • 感谢您的解释,您的解决方案正是我所需要的!
      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      相关资源
      最近更新 更多