【问题标题】:Memory leak in cellForRowAtIndexPath:cellForRowAtIndexPath 中的内存泄漏:
【发布时间】:2010-12-05 16:48:26
【问题描述】:

在给定 indexPath 的情况下,我想获取对相关单元格的引用以删除复选标记。我以为我可以为此使用 cellForRowAtIndexPath,但我收到了消息:

__NSAutoreleaseNoPool(): 类 UITableView 的对象 0x685a600 自动释放,没有适当的池 - 只是泄漏

即使是这样的简单行:

[self.tableView cellForRowAtIndexPath:indexPath];

所以,这不仅仅是返回一个指向单元格的指针,对吧?也许我误解了这种方法的用途。是否可以简单地获取对单元格的引用来更改附件视图? 谢谢!

【问题讨论】:

  • 我们能否看到更多您的代码(例如,您使用什么来移除配件)?很难从一条无害的线中分辨出任何东西......
  • 是的,我在后台执行选择器。我不知道自动释放已发送到返回值。我真的不记得我在内存管理指南中读过这个。我一定错过了。但是感谢您指出这一重要的事情!我刚刚创建了一个 NSAutoreleasePool,现在一切正常。

标签: iphone objective-c uitableview ios4 nsautoreleasepool


【解决方案1】:

此错误:_NSAutoreleaseNoPool() 通常与此完全相关 - 没有适当的自动释放池。 Autoreleasepools 是基于线程的,所以如果你在后台或另一个线程上执行它(很难从这个小代码中分辨出来)你需要在那个线程中创建一个 NSAutoreleasPool 并在你完成执行后释放它.

【讨论】:

  • 这实际上是问题所在......但为什么我需要一个自动释放池? cellForRowAtIndexPath: 是否分配任何数据?它不是只返回一个指向已经存在的单元格的指针吗?感谢您的帮助!
  • 您的错误信息显示 UITableView 正在泄漏。 Joe Blow 在下面正确指出,(隐式)吸气剂是问题所在。按照惯例,getter 的返回值是自动释放的。所以只是 self.tableView;如果您没有自动释放池,则一条线本身会泄漏。与下面的@Joe Blum 相比,我不建议忘记 getter,而是只使用自动释放池。
  • @Joe:除了setter和getter本身,你什么时候不使用这个属性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多