2011-07-14 41 views
1

我的問題後,這個......有什麼優點和保持在UIViewController的前面的UIViewController到一個UIViewController一個參考的利弊已經推到導航控制器後是這樣的考慮好編程實踐。這是演示我的問題的代碼。保持一個參考到iPhone的UIViewController推

保持參考

部首

MainMenuViewController *mainMenuController; 
@property (nonatomic, retain) MainMenuViewController *mainMenuController; 

if (self.mainMenuController == nil) 
{ 
    //Goto the next page 
    MainMenuViewController *controller = [[MainMenuViewController alloc] init]; 
    self.mainMenuController = controller; 
    [controller release]; 
} 
[self.navigationController pushViewController:mainMenuController animated:TRUE]; 

沒有跟上參考

MainMenuViewController *controller = [[MainMenuViewController alloc] init]; 
[self.navigationController pushViewController:controller animated:TRUE]; 
[controller release]; 

回答

1

保存參考文獻更多的是關於您的使用情況。如果您推動將來通常使用的視圖控制器,那麼您將需要保留對其的引用。但是,如果它是一次性使用視圖,則可能不想保留它。或者你可能想保留它,所以你只需要加載一次。

或者,如果你有一個xib爲你加載視圖,那麼你將保持對該視圖的引用,除非你想在每次你想使用它時從xib重新加載。

例如,如果您正在將包含Web視圖的視圖加載到導航控制器中。您可能需要加載它。設置網址,以便加載頁面。然後將它交給導航控制器,讓用戶從那裏導航網頁。

但是,如果您要將主頁推入堆棧,並且有可能將命令從其他頁面發送回該頁面。您需要保留視圖,以便您可以讓他們在後續頁面中執行的操作通過協議,應用程序委託或任何其他您可以使用的引用方式回到主頁。

無論哪種方式,你將不得不作出這種區別。請記住,保持太多內存會給你一個警告,那時你需要優先考慮你想要保留的東西以及你可以擺脫的東西。這是應用程序設計獲得樂趣的地方:)

希望有所幫助。祝您好運

0

這取決於應用程序的需求。讓我們假設你想添加或推導航堆棧在此之前我們已經可以分配mainController做任何我們想做的工作是做些什麼後刪除的東西主控制器。我告訴有一個例子我在我的情況下,做的是我需要表現出對的tableView一些數據,讓說的tableView是viewController2和我得到的viewController1該表的數據源,所以我才推viewController2我初始化viewController2保持它的參考並將數據源分配給viewController2並重新加載表。這是我保持參考的理由。

1

很難不知道更多關於你的執行的話。

如果保留視圖控制器包含一堆沉重的非視圖依賴對象(可能是數據源),那麼如果用戶沒有做任何事情來調用首次加載後再次查看。另一方面,如果由於某種原因加載視圖和/或控制器很昂貴,並且您確定用戶會經常訪問它,那麼抓住視圖控制器可能是一個好主意,並使您的應用程序更響應。

如果你選擇守住視圖控制器,一定要響應內存警告並在必要時轉儲控制器。

順便說一句,如果你想閱讀你的代碼後,當保存幾個按鍵,讓您的病情不清楚,你能做到這一點,以測試零岬:

if (!self.mainMenuController)

0

正如你指出你不斷參考。正如這個詞所描述的那樣,它是創建者對象與正在創建的對象之間的單向關係。所以保持關係的需要是能夠與創建的對象交流。如果你沒有一個參考,你不能談論它。因此,無論何時您設計需要與新創建的對象進行交談的內容,都需要保留對它的引用。

1

鑑於您示例中的類名爲MainMenuViewController,我想說在這個實例中正確的是保持對象的活性,因爲它聽起來像用戶將不斷回來的東西。視圖控制器通常是輕量級的,並且在內存變得不足時脫離屏幕視圖,當它們再次變爲可見時重新創建它們。你應該習慣於設置任何東西(不只是視圖),這些東西可以在-viewDidLoad中類似處理,並在-viewDidUnload中拆除。

如果您是從動態列表中選擇視圖控制器(例如郵件應用程序在您選擇郵件時執行的操作),那麼儘管您可能希望保留引用,但您可能不打算保留引用一個用於最近的視圖控制器,以便在用戶錯誤地按下後退按鈕時更加寬容,通過返回到您以前所處的詳細視圖中完全相同的狀態。

0

您在兩個視圖控制器之間創建了不希望的耦合。您正在編寫MainViewController始終具有MainViewController類型的父項。這是一個不必要的限制。將來,您可能希望直接從另一個視圖控制器實例化並加載MainViewController。

通常,使用UINavigationController時,每個視圖控制器不應該對其父視圖控制器的類型做出假設。

更好的方法使用委託/協議模式。

部首

@protocol MainViewControllerProtocol; 
@interface MainViewController : UIViewController { 
    id <MainViewControllerProtocol> delegate 
} 
    @property (nonatomic, assign) id <MainViewControllerProtocol> delegate; 
@end 

@protocol MainViewControllerProtocol <NSObject> 
    - (void)somethingHappened; 
@end 
相關問題