IOS uiviewcontroller:如果将rootviewcontroller设置为新的viewcontroller,viewcontroller是否可用

IOS uiviewcontroller:如果将rootviewcontroller设置为新的viewcontroller,viewcontroller是否可用,ios,objective-c,iphone,uiviewcontroller,modal-dialog,Ios,Objective C,Iphone,Uiviewcontroller,Modal Dialog,我有两个UIViewController:loginViewController和MainViewController 我的应用程序逻辑如下: 在didFinishLaunchingWithOptions中,我检查用户是否已登录。 如果是,则转到MainViewController。 如果没有,我转到loginViewController让他登录,然后转到MainViewController 当用户在MainViewController中时,他可以注销。当他注销时,他将转到LoginView控制

我有两个UIViewController:loginViewController和MainViewController

我的应用程序逻辑如下:

  • 在didFinishLaunchingWithOptions中,我检查用户是否已登录。 如果是,则转到MainViewController。 如果没有,我转到loginViewController让他登录,然后转到MainViewController

  • 当用户在MainViewController中时,他可以注销。当他注销时,他将转到LoginView控制器

  • 所有视图控制器都是通过编程方式创建的。所以当用户在MainViewController中时,当他单击注销按钮时,我创建了一个新的loginViewController并将rootViewController设置为它

    我的问题是: 如果用户通过loginViewController转到MainViewController,MainViewController.presentingViewController是loginViewController,而loginViewController.presentedViewController是MainViewController,那么当我将rootViewController设置为新创建的loginViewController时,它们会在某个时候被释放还是始终保留在内存中

    由于注销按钮不一定在MainViewController中,如何从注销按钮的viewController转到loginViewController?如果使用presentViewController,是否会创建过多重复的viewController?如果我将rootViewController设置为loginViewController,那么如果其他ViewController通过presentingViewController和presentedViewController彼此具有强引用,它们将如何释放

    我对ViewController的生命周期有点困惑

    抱歉,描述太长了

    谢谢,
    -Lee

    回答您的第一个问题“当我将rootViewController设置为新创建的loginViewController时,它们是否会在某个时候被释放,或者始终保留在内存中”

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


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


    把它想象成一棵树。窗口的rootViewController是主干。所有其他视图控制器都从它分支。因此,如果使用新的视图控制器替换rootViewController,则整个层次结构将再次被释放,前提是没有其他对象保留对任何视图控制器的强引用。谢谢回答。但是它们由presentedViewController和PresentingViewController相互指向。这两个属性并不弱。那他们为什么会被释放呢?@user1165560事实上你是对的!“显示视图控制器”似乎与“显示视图控制器”有很强的交叉引用,这让我感到惊讶。我已经对此进行了研究,并提出视图控制器的行为是不直观的,在我看来是有缺陷的。你可能想看看我准备的这三个例子,谢谢你的例子。这是否意味着我应该在登录后使用push而不是present,因为loginView不会关闭mainView。也许使用演示是错误的…@user1165560很难说。我尽量避免情态动词,因为它不是第一次给我带来问题。在UINavigationController中管理ViewController堆栈非常简单。另一方面,presentViewController:API的存在是有原因的,在某些情况下,我们几乎被迫使用它。但是如果我有什么建议的话,如果可以的话,就用
    UINavigationController
    。明白了。在这种情况下,我应该使用push-for。现在我明白了什么时候多用情态动词:-)