1

我有一個UITableView的實例,以及一個遵守委託和數據源協議的獨立類。我這樣做,像這樣:Objective-C中的自動釋放和「分配」屬性? (在iPhone上)

SubjectTableViewHandler *handler = [[[SubjectTableViewHandler alloc] init] retain]; 
tv.delegate = handler; 
tv.dataSource = handler; 
[handler autorelease]; 

我不想保持處理程序,伊娃,如果我脫下retain通話結束時,當autorelease發生時,它被送到release,然後添加到池中,這會導致EXC_BAD_ACCESS。所以目前,保留計數爲:

(1) At init: 1 
(2) At retain: 2 
(3) delegate/datasource properties are 'assign', still 2 
(4) At autorelease: 1, now in autorelease pool. 

但後來因爲屬性是「分配」,他們將永遠不會被釋放,保留計數將永遠不會打到0,處理器將永遠不會被釋放反正。是否有更有效的方法來完成這項工作,而不是像伊娃那樣維護處理程序並將其發佈到dealloc方法中?

回答

5

當您使用init初始化對象時,您聲明擁有它,並且沒有理由調用retain。你也不想調用autorelease,因爲這會導致對象在運行循環中被釋放。因爲你需要在方法返回後讓處理程序(以便你的tableView可以調用委託/數據源方法)和對處理程序的引用(所以你可以在你完成顯示tableView時釋放它),那麼最乾淨的方法是使它成爲一個伊娃。

1

正如你所提到的,我能看到的唯一解決方案是使它成爲一個ivar並與表並行分配和釋放它。

+0

我想知道爲什麼這是downvoted到-2?將數據源的引用存儲在某個實例變量中*是正確的。 – 2009-04-26 21:36:16

+0

我不能不放棄,但馬克是正確的。我原本可能會誤解,但爲了記錄,我錯誤地低估了這個答案。 (對不起) – amattn 2009-04-29 05:47:28

0

這一切都取決於您使用表視圖。

通常的做法是創建一個視圖控制器,它是表和表的代表,可能是控制器的成員。

作爲另一種選擇,您可以從UITableView繼承並使其自身進行委託。

有時候最好使用單例委託。

此外,在表委託方法中,第一個參數是tableview,因此一個委託對象可以服務多個表。