2014-10-20 47 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

相关问题