2014-03-06 35 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