2013-11-15 34 views
2

我試圖在移至ARC後調整項目。 我最大的問題是,由於循環引用,對象不會被釋放。例如。在UIView dealloc沒有被調用(我以前用來釋放對象並將它們放在nil上,因爲這些對象阻止了dealloc。不再需要,但現在我有一個UITableViewCells的問題。在一個我有一個通知觀察者,並且細胞留在內存中,如果觀察者創建。當不再使用時從UITableViewCell中移除觀察者

什麼是最好的方法來檢測是否例如)的UITableViewCell不再需要了,所以我可以刪除觀察者和對象可以從內存釋放自己?

這是我的標題:

@interface DOArticleListCell : DOPrototypeCell { 
    IBOutlet UILabel *_title; 
    IBOutlet UILabel *_summary; 
    IBOutlet UILabel *_site; 
    IBOutlet UILabel *_update; 
    IBOutlet UILabel *_unpublished; 
    IBOutlet UIButton *_readButton; 

    __weak DOArticle *_article; 
    NSNumber* _isEditor; 
} 

@property (nonatomic, weak) DOArticle *article; 

- (void)updateReadButton; 
- (IBAction)toggleReadButton:(id)sender; 

@end 

(原型細胞只是有稱爲 'populateCell'。一個功能)

聚苯乙烯。當打開選中單元格時調用detailViewController時,我需要觀察者更新「讀取」標籤。

+0

設計你的代碼,當你不想讓引用保持對象存活時,使用弱引用。 – Arkku

+1

你真的需要觀察者嗎? – Moxy

+0

我需要觀察者來更新tableview上的'Read'符號。加載詳細視圖時,該項目被標記爲讀取,並且觀察者由ManagedObjectContextSave通知觸發並更新標籤。我沒有成功讓另一位觀察者更新tableviewcell(當不在視圖中時)。NSFetchedResultsController似乎沒有在tableview上觸發它,儘管也許它應該。 –

回答

4

你很可能不想在你的手機上使用觀察者。爲什麼不?你的細胞正在被重複使用。假設您的表格視圖中有400個項目。在任何時候,屏幕上只會顯示大約8個。這意味着您的單元格只有8或9個實例將保存在內存中,並在用戶滾動時重新使用。這意味着每次單元格被滾動出視圖時,您都必須刪除觀察者,並且您需要爲重新使用的單元格添加新的觀察者。你可以通過覆蓋單元的prepareForReuse方法來做到這一點。但是,保存任何狀態(如將單元格標記爲「已讀」)不應在單元格中完成,而應在模型中完成。

因爲在你的情況下,用戶操作觸發了read狀態的更新,你可以簡單的數據模型項設置爲readtableView:didSelectRowAtIndexPath:,然後在您的自定義單元格或通過調用自定義的方法明確更新一個細胞呼籲[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

希望它有幫助。

+0

這幾乎是我所建議的。 – Mundi

+0

@Mundi好吧,不是。我解釋了爲什麼在細胞上使用觀察者是一個不好的主意,我指出了一個無觀察者的解決方案。不過,我們都同意國家應該保留在模型中而不是在單元格中,這是事實。對此的讚譽似乎有點苛刻。 –

+0

我沒有投票;-)。 – Mundi

2

儘管ARC您仍可以實現 - 在您的類(無效)的dealloc和呼叫

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"yourNotName" object:nil] 
1

你的觀察員的設計也許可以得到改善。使控制器包含視圖是你想要做出反應的觀察者似乎更加合適。然後在視圖控制器的viewWillDisappear中刪除自己作爲觀察者。

收到通知後,您應該更改表格視圖的datasource。然後你可以檢查應該得到它的單元格是否可見。如果是,則更新它,否則應該在滾動到視圖中時自動顯示新信息。

相關問題