2009-06-02 69 views
12

我遇到了一種似乎另有建議的情況。在下面的代碼片段中,如果我刪除了這一行:self.navigationController = nav,那麼根控制器的視圖將不會顯示出來,向我暗示addSubview可能實際上並未保留視圖,如其他建議。任何想法?UIView的addSubview是否真的保留了視圖?

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]]; 

    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.testViewController]; 

    self.navigationController = nav; //<-- if this line is removed, test view won't show up 

    [window addSubview:nav.view]; 

    [nav release]; 
} 
+0

您的標記答案不正確,原因我在下面評論。 – 2009-06-02 06:31:20

回答

24

這條線:

[window addSubview:nav.view]; 

沒有一個視圖立即添加到屏幕上。它由OS在未來的某個運行循環中顯示在可能不同的線程上。我們無法確定的實際執行情況。

這就是爲什麼Apple定義了像viewDidAppear/viewWillAppear這樣的委託方法,否則我們不需要它們,因爲我們知道這些事件發生的準確時間。

此外,如你所說的添加子視圖確實保留了視圖。它不是不是但是保留視圖控制器或導航控制器。由於導航控制器保留任何添加的視圖控制器,我們不必用伊娃支持他們。

但是,您提到的導航控制器必須堅持超出該方法的範圍。或者取決於你的代碼,它可能被解除分配或丟失參考。

所以你必須保持到導航控制器的參考與伊娃並設置它像這樣:

self.navigationController = nav; 

因此,即使nav.view包含一個指向testViewController.view,應用程序沒有引用導航控制器以及擴展視圖。結果是一個空白屏幕。


爲了使這更明顯的是,它不是一個保留/釋放問題,你實際上是在下面的方法泄漏:

self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]]; 

你需要自動釋放,以平衡你的保留/釋放由:

self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease]; 

所以,這意味着你的觀點永遠不會被釋放你已經跑這個代碼的任何時間。這進一步向我們保證,你的問題確實是一個丟失的參考。

0

這看起來不像lika保留/釋放問題給我。如果你註釋掉self.navigationController = nav;因爲那麼在下一行[window addSubview:self.navigationController.view]你的self.navigationController屬性將不會被設置。它可能是零,或者它會崩潰,但不能確定沒有更多的代碼。

+0

當事情沒有奏效時,我已經將代碼更新回原始代碼,並且必須將self.navigationController引入到包含nav的引用中。另外,你在上面看到的是所有的代碼,沒有別的。 – Boon 2009-06-02 03:41:11

+0

在objective-c中,ivars從0開始。所以,self.navigationController只是零。 – 2009-06-02 03:42:57

2

的問題可能不是該視圖不保留,它的控制器不保留。

沒有這一行:

self.navigationController = nav 

沒有什麼是保留導航控制器。讓視圖超過控制器是很奇怪的。

+0

視圖不是「神奇地」綁定到視圖控制器。視圖不會因視圖控制器死亡而死亡。如果視圖保留在其他地方,它絕對會超過任何視圖控制器。 – 2009-06-02 06:28:50

相關問題