我有两个UIViewControllers:loginViewController和MainViewController。
我的应用逻辑是这样的:
在didFinishLaunchingWithOptions中,我检查用户是否已经登录。 如果是,我去MainViewController。 如果不是,我去loginViewController让他登录然后转到MainViewController。
当用户在MainViewController中时,他可以注销。当他退出时,他将转到LoginViewController。
所有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
答案 0 :(得分:0)
回答你的第一个问题“当我将rootViewController设置为新创建的loginViewController时,它们会在某些时候被释放,还是会永远留在内存中”
他们将被释放(除非他们被你帖子中没有提到的东西保留)。如果loginViewContorller
是窗口的rootViewController并且其上显示mainViewController
,那么如果您创建一个新的loginViewContorller
并用它替换窗口的rootViewController,那么旧的loginViewContorller
和{ {1}}将被释放。
回答你的第二个问题 别担心。如果在任何时候您使用新的视图控制器替换窗口的rootViewController,则UI将立即切换到新创建的视图控制器,并且将释放所有其他视图控制器。
把它想象成一棵树。 Window的rootViewController是主干。所有其他视图控制器都是从它分支的。因此,如果将rootViewController替换为新的视图控制器,则假设没有其他对象保持对任何视图控制器的强引用,整个层次结构将被释放