2013-07-13 66 views
23

當我的應用第一次加載時,我將我的UIWindowrootViewController屬性設置爲controllerA更改UIWindow的rootViewController

有時在我的應用程序中,我選擇將rootViewController更改爲controllerB

問題是,有時當我在controllerB做翻轉過渡時,我看到controllerA的背後。出於某種原因,該觀點未被刪除。更令人擔憂的是,在將rootViewController設置爲controllerB,controllerAdealloc方法之後永遠不會被解僱。

我試圖刪除的UIWindow子視圖切換到controllerB之前手動,也解決了看小號的dealloc仍然不會被調用controllerA「的背景,但controllerA的看法」的問題。 這是怎麼回事?

蘋果文檔說:

根視圖控制器提供窗口的內容圖。將視圖控制器分配給此屬性(以編程方式或使用Interface Builder)將視圖控制器的視圖作爲窗口的內容視圖進行安裝。如果該窗口具有現有的視圖層次結構,則在安裝新視圖之前將刪除舊視圖。

UPDATE

這裏是我的AppDelegate的代碼:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [self showControllerA]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void)showControllerA 
{ 
    ControllerA* a = [ControllerA new]; 
    self.window.rootViewController = a; 
} 

- (void) showControllerB { 
    ControllerB* b = [ControllerB new]; 
    self.window.rootViewController = b; 
} 
+0

您可以在應用程序委託中爲您的'application:didFinishLaunchingWithOptions:'方法提供代碼嗎? – Cezar

+0

愚蠢的問題,但是當你推第二個控制器時,你把'controllerA'設置爲零嗎?如果沒有,那麼它不會釋放。 (我假設你是) – Putz1103

+0

我從來沒有保持一個指向controllerA的指針,所以不知道我會設置爲零。 – aloo

回答

11

原來有兩個單獨的問題。 1)我在控制器A中有一個保留週期,所以它從來沒有得到解除分配。其次,爲了更改根視圖控制器,您必須先刪除Windows子視圖(即使文檔有其他建議)

1

的問題可能是你實現ControllerA或ControllerB的,他們可能會在代碼,以便ARC保留 '自我'不能自動dealloc你ViewController。你可以發佈ControllerA和ControllerB的實現嗎?

+0

的精簡版的問題,這將解釋爲什麼dealloc沒有被調用。但是爲什麼控制器A的視圖仍然在控制器B後面可見。不更改根視圖控制器從窗口中刪除controllerA的視圖? – aloo

相關問題