2014-03-06 36 views
0

我真的很努力理解从基于ARC-项目自定义tableViewCell内存泄漏和希望有人也许能够揭示一些轻若以下可能负责,或者我完全吠叫了错误的树。基本建议

所以,我推着tableViewController到navigationController和TableView中,我有我自己的自定义tableViewCells。

这种风俗tableViewCell具有从的cellForRowAtIndexPath和分换句话说分配给tableViewController本身,所以委托财产......

cell.delegate = self; 

这种风俗tableViewCell也有一对夫妇的通知中心观察员。现在

,我已经把代码以去除tableViewCell的dealloc的观察员和同样去加...

self.delegate = Nil; 

...才发现的dealloc没有以前任何时候都被称为,即使在点击返回时(例如,通过推送的tableViewContoller有效地返回导航堆栈)。

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

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

@property (nonatomic, retain) MyTableViewController *delegate; 
+0

的Une仪器找出你泄露了什么(或者超过保留),并从那里。代表是否保留(通常不应该)。表格视图控制器应该在表格视图告诉它不再显示单元格时移除它自己。 – Wain

+0

这可能有助于了解如何在自定义单元视图中定义代理iVar。但是,由于性能的原因,要知道'UITableViewCell'可以被回收(通过'initWithStyle:reuseIdentifier:'和'dequeueReusableCellWithIdentifier:')。如果表格单元格是可重用的,那么在表格视图消失之前,您可能不会立即看到对象的dealloc。 –

+0

好点 - 添加了我的iVar定义。 – bcl

回答

2

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

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

否则,你得到一个有力的参考周期

controller -> table view -> cell -> controller 

nb weak特定于ARC,如果您不使用ARC,则需要使用assign,并确保在完成委托后自行将其删除。

+0

这是一个公平的建议,尤其是考虑到我现在使用保留。请尝试一下,看看是否有什么好转 - 欢呼声。 – bcl

+0

好东西 - 这对泄漏的大小做了相当大的改进,加上dealloc现在被调用。太感谢了! – bcl