3

給定具有UINavigationController和2個級別的UITableViews的應用程序部分(即在根控制器上選擇一行,將第二個控制器推到導航堆棧上),我有以下問題:視圖控制器之間的通信

1)兩個控制器都需要一個用戶對象。兩個控制器之間進行通信的最佳方式是什麼?我看到的此站點,其中提到扶養注射和根控制器可以由用戶對象傳遞給所述第二電平控制器的柱:

@implementation SecondLevelViewController 

-(void) initWithUser: (User *) user { 
    // myUser is an instance variable 
    myUser = user; 
    [myUser retain]; 
} 

在該示例中所述第二控制器將似乎保留用戶而在這種情況下(鬆散耦合),我已經看到其他資源(例如斯坦福iPhone開發課程),它鼓吹用戶被簡單地分配,而不保留。

我也看到了一個委託形式的參數,在第二個控制器(而不是上面的保留的User實例變量)上使用分配的id對象。

如果有人能夠爲我澄清這一立場,我感到非常困惑,因爲這個領域看似矛盾的建議讓我感到非常困惑。視圖控制器之間進行通信的最佳方式是什麼?

2)我的第二個問題也涉及到控制器的結構。我已經看到了一些例子,其中根控制器(在上面的安排中)有一個實例化的二級控制器陣列。在專業應用程序中這是正常的還是會對以這種方式做事情有顯着的記憶影響(即沒有延遲加載)?我認爲陣列的優點是減少二級控制器的加載時間?

謝謝你的迴應,因爲我正在試圖正確地開發事物,而不是將它們拼湊在一起。

回答

3

1)「視圖控制器之間通信的最佳方式是什麼?」

沒有人「最好」的方式。您可以在初始化時將模型對象傳遞給視圖控制器。在這種情況下,控制器通常應該保留模型。如果您正在編寫一個關注可重用性的通用視圖控制器類(如UITableViewController),那麼使用委託進行是一個很好的選擇。

2)「我看到例子,其中根控制器(在上述結構形式中)具有實例化的第二電平的控制器的陣列,這是正常的專業應用」

首先,你應該限制自己的帖子所以每個帖子有一個問題。視圖控制器本身的內存影響通常很低。它的實例變量只需要幾百字節。內存密集的部分是視圖本身。並且UIViewController的視圖加載/卸載機制將在需要時注意卸載內存密集型視圖(即,如果它收到內存警告並且視圖當前不在屏幕上)。所以只要你正確執行viewDidLoadviewDidUnloaddidReceiveMemoryWarning,我不會過多擔心視圖控制器數組的內存消耗。

UITabBarController也包含一個子控制器數組,所以沒有任何問題。但是,您應該避免的是,一個控制器需要保存整個子控制器層次結構(即不僅是二級,而且還包括三級等):不是因爲內存問題,而是爲了避免不必要的耦合。

+0

感謝您的回答Ole和我注意到您對每個問題的一篇文章的評論。然而,我只是好奇,如果數組方法(在我的第二個問題中提到)確實有任何加載速度優勢,或者它只是一個有用的方法來構造您的代碼? – Urizen 2009-12-10 12:33:57

+0

實例化一個視圖控制器對象不應該花費大量的時間,所以我會說任何加載速度優勢都是微不足道的。需要花費時間的是加載視圖,但數組方法不會改變視圖控制器無論如何都會延遲加載視圖的事實。 – 2009-12-10 12:59:18

+0

再次感謝您。非常有用的答案。 – Urizen 2009-12-10 13:35:45

1

通常你應該儘量避免直接在控制器之間傳遞數據。

您可以設置每個控制器有權訪問的模型,然後可以實施通知以通知其他控制器發生了某些事情。另一個控制器可以從模型中獲取所需的任何數據。

這樣你可以保持你的控制器分離。