2011-06-25 49 views
1

是否值得存儲對當前視圖控制器打開的其他視圖控制器的引用?如果我有一個viewcontroller顯示一個帶有打開popoverviewcontroller的按鈕的屏幕,我應該保留一個對它的引用,然後檢查該變量是否爲零,只讓popoverviewcontroller一次?還是沒有必要?它在某些情況下會導致許多額外的變量,並會產生額外的代碼,但如果有人可以說這是不必要的,那將會很好。保持對其他視圖控制器的引用是否正常?

if (self.popoverVC == nil) { 
    UIPopoverController *popVC = [[UIPopoverController alloc] initWithContentViewController:self.configureTest]; 
    popVC.popoverContentSize = CGSizeMake(320.0, 460.0); 
    popVC.delegate = self; 

    self.popoverVC = popVC; 
    [popVC release]; 
} 

回答

3

存儲到其他控制器的引用,我無所謂,我做它時,它似乎是合理的我。將delegate pattern想象爲模型控制器之間交互的一種方式。

雖然有其他選擇。

在你的具體情況,而不是存儲的參考控制器,你可以設置一個標誌(但我不知道這是有道理的,你的具體工作流程)指定的按鈕被按下。

不適合你的情況,但總體可能有用的是訪問的UIViewController S中的「父」的層次結構。 UIKit沒有明確維護這個功能,因此您可以設置parentViewController屬性,也可以從一個控制器轉到其父級導航UIResponder層級。這不適用於你的情況,在我看來,因爲溝通將由兒童管理員發起(在你的情況下你對相反的情況感興趣)。無論如何,谷歌,如果你有興趣。

你必須使用通知的另一個選項:一個控制器可以註冊通知,另一個可以觀察到它。

[[NSNotificationCenter defaultCenter] postNotificationName:@"notifName" object:self]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reactToNotif:) name:@"notifName" object:nil]; 

這比一個函數調用更貴一些,但它不需要的ivar和控制器之間沒有耦合。

2

這非常明智,特別是如果你想讓popVC在外觀之間保持狀態。 當您收到內存警告時,釋放非活動的vc是明智的做法。

1

保持對UIPopoverController的引用(它不是UIViewController的子類,它是NSObject的子類)的原因與保留對UIViewController的引用略有不同。

當您展示UIPopoverController時,它不會自動保留。所以你必須自己保留它。 與您呈現(或推送)時自動保留的UIViewController相比。

有技巧,只是保留了控制器不保持一個參考,它在告訴你,酥料餅被駁回委託方法釋放。

對我來說,那些技巧總覺得有點骯髒。例如,您沒有選擇手動關閉彈出窗口。


由於ARC在LLVM頁面上公開記錄,所以我可以告訴你,如果你使用ARC,那些技巧會停止工作。您必須保留一個引用,否則編譯器會在您離開顯示彈出窗口的方法後立即釋放它。

相關問題