2014-10-20 48 views
1

我有兩個UIViewControllers:loginViewController和MainViewController。IOS uiviewcontroller:如果rootviewcontroller設置爲一個新的viewcontroller將視圖控制器是免費的

我的應用程序的邏輯是這樣的:

  1. 在didFinishLaunchingWithOptions,我檢查,如果用戶已經登錄 如果是的話,我去MainViewController。 如果不是,我去loginViewController讓他登錄,然後去MainViewController。

  2. 當用戶在MainViewController中時,他可以註銷。當他註銷時,他會去LoginViewController。

所有的viewController都以編程方式創建。所以當用戶在MainViewController中時,當他點擊註銷按鈕時,我創建了一個新的loginViewController併爲其設置了rootViewController。

我的問題是: 如果用戶通過loginViewController去MainViewController,MainViewController.presentingViewController是loginViewController和loginViewController.presentedViewController是MainViewController,他們會在某個時候被釋放,否則他們將永遠留在了記憶,當我設置RootViewController的給新創建loginViewController?

由於註銷按鈕未必是MainViewController,我怎麼能去loginViewController從註銷按鈕的的viewController?如果我使用presentViewController,是否會有太多重複的viewController創建?如果我將rootViewController設置爲loginViewController,那麼如果其他viewController通過presentationViewController和presentedViewController具有強引用關係,它將如何釋放?

我對viewControllers的生命週期有點糊塗......

對不起長描述...

感謝, - 李

回答

0

要回答你的第一個問題「,他們將在某些時候被釋放,否則他們將永遠留在了記憶,當我設置RootViewController的新創建loginViewController」

他們將被釋放(除非它們被保留的東西沒有你提到的r後)。如果loginViewContorller是窗口的rootViewController並且上面顯示mainViewController,那麼如果您創建一個新的loginViewContorller並用它替換窗口的rootViewController,那麼舊的loginViewContorllermainViewController將被釋放。


回答你的第二個問題。
別擔心。如果在任何時間點更換窗口的一個新的視圖控制器RootViewController的,那麼UI就會立即切換到新創建的視圖控制器和所有其他視圖控制器將被釋放。它

看成是一個樹。窗口的RootViewController的是後備箱。所有其他視圖控制器都從它分支。因此,如果你用新的視圖控制器替換rootViewController,則假設沒有其他對象保持對任何視圖控制器的強引用,則整個層次結構被釋放

+0

感謝您的回答。但是它們通過呈現控制器和呈現控件來指向對方。這兩個屬性並不弱。那爲什麼他們會被釋放? – user1165560 2014-10-20 04:32:39

+0

@ user1165560你其實是正確的!看起來,呈現的視圖控制器與呈現視圖控制器有很強的交叉引用,這讓我感到驚訝。我研究過這個,並提出視圖控制器的行爲是不直觀的,在我看來是有缺陷的。你可能想檢查我準備的這三個例子https://gist.github.com/bartekchlebek/4b2568e22f372bd8cd2f – 2014-10-20 05:10:27

+0

感謝你的例子。這是否意味着我應該在登錄後使用push而不是present,因爲mainView不會被loginView取消。也許使用呈現是錯誤的... – user1165560 2014-10-20 05:41:09

相關問題