IOS uiviewcontroller:如果将rootviewcontroller设置为新的viewcontroller,viewcontroller将是空闲的

时间:2014-10-20 02:05:33

标签: ios objective-c iphone uiviewcontroller modal-dialog

我有两个UIViewControllers:loginViewController和MainViewController。

我的应用逻辑是这样的:

  1. 在didFinishLaunchingWithOptions中,我检查用户是否已经登录。 如果是,我去MainViewController。 如果不是,我去loginViewController让他登录然后转到MainViewController。

  2. 当用户在MainViewController中时,他可以注销。当他退出时,他将转到LoginViewController。

  3. 所有viewControllers都是以编程方式创建的。因此,当用户在MainViewController中时,当他点击logout按钮时,我创建了一个新的loginViewController并将rootViewController设置为它。

    我的问题是: 如果用户通过loginViewController转到MainViewController,MainViewController.presentingViewController是loginViewController,loginViewController.presentedViewController是MainViewController,它们会在某些时候被释放,或者当我将rootViewController设置为新创建的loginViewController时它们将永远保留在内存中吗?

    由于注销按钮可能不一定在MainViewController中,我怎么能从logout按钮的viewController转到loginViewController?如果我使用presentViewController,是否会创建太多重复的viewController?如果我将rootViewController设置为loginViewController,如果通过presentViewController和presentsViewController对其他viewControllers有强引用,那么将如何释放其他viewControllers?

    我对viewControllers的生命周期感到困惑......

    对于长篇说明感到抱歉......

    谢谢, -lee

1 个答案:

答案 0 :(得分:0)

回答你的第一个问题“当我将rootViewController设置为新创建的loginViewController时,它们会在某些时候被释放,还是会永远留在内存中”

他们将被释放(除非他们被你帖子中没有提到的东西保留)。如果loginViewContorller是窗口的rootViewController并且其上显示mainViewController,那么如果您创建一个新的loginViewContorller并用它替换窗口的rootViewController,那么旧的loginViewContorller和{ {1}}将被释放。


回答你的第二个问题 别担心。如果在任何时候您使用新的视图控制器替换窗口的rootViewController,则UI将立即切换到新创建的视图控制器,并且将释放所有其他视图控制器。

把它想象成一棵树。 Window的rootViewController是主干。所有其他视图控制器都是从它分支的。因此,如果将rootViewController替换为新的视图控制器,则假设没有其他对象保持对任何视图控制器的强引用,整个层次结构将被释放