【问题标题】:Basic advice on memory leaks in custom tableViewCells关于自定义 tableViewCells 内存泄漏的基本建议
【发布时间】:2014-04-09 09:49:04
【问题描述】:

我真的很难理解来自基于 ARC 的项目中自定义 tableViewCell 的内存泄漏,并希望有人能够阐明以下是否可能是负责任的,或者我是否在吠叫错误的树完全。

所以,我将 tableViewController 推送到 navigationController 中,并且在 tableView 中我有自己的自定义 tableViewCells。

这个自定义 tableViewCell 有一个 delegate 属性,该属性是从 cellForRowAtIndexPath 分配的,并指向 tableViewController 本身,换句话说...

cell.delegate = self;

这个自定义的 tableViewCell 也有几个 NotificationCenter 的观察者。

现在,我已经在 tableViewCell dealloc 中添加了删除观察者的代码,并同样去添加...

self.delegate = Nil;

...只是发现似乎从未调用 dealloc,即使在点击返回时(即返回导航堆栈有效地完成推送的 tableViewContoller)。

所以,我想这可以归结为:细胞的这些方面是否会导致泄漏?如果是这样,我是否会以正确的方式阻止泄漏?

编辑:我将我的委托属性定义如下:

@property (nonatomic, retain) MyTableViewController *delegate;

【问题讨论】:

  • 使用仪器来找出您正在泄漏(或过度保留)的内容以及来自何处。是否保留了代表(通常不应该保留)。当表格视图告诉它不再显示单元格时,表格视图控制器应该自行移除。
  • 了解如何在自定义单元格视图中定义委托 iVar 可能会有所帮助。但是,请注意,出于性能原因,UITableViewCell 可以被回收(通过initWithStyle:reuseIdentifier:dequeueReusableCellWithIdentifier:)。如果表格单元格是可重用的,那么在表格视图消失之前,您可能看不到对象上的立即解除分配。
  • 好点 - 添加了我的 iVar 定义。

标签: ios uitableview memory-leaks


【解决方案1】:

另一个问题可能是这个:

iOS 7.0 and ARC: UITableView never deallocated after rows animation

如果您在 iOS 7.0.3+ 上运行,则不适用。

【讨论】:

  • 是的 - 在这种情况下不适用,但绝对值得了解。
【解决方案2】:

您需要将您的自定义委托声明为weak

@property (nonatomic, weak) id<MyCustomDelegateProtocol> delegate;

否则你会得到一个强引用循环

controller -> table view -> cell -> controller

n.b. weak 是特定于 ARC 的,如果您不使用 ARC,则需要使用 assign,并确保在您完成代理后自己将其置空。

【讨论】:

  • 这是一个公平的建议,特别是考虑到我目前正在使用保留。会试一试,看看是否有任何改善 - 干杯。
  • 很棒的东西 - 这对泄漏的大小做了相当大的改进,而且现在正在调用 dealloc。谢谢一百万!
猜你喜欢
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2021-05-04
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多