Objective-C:模态分段和释放视图控制器

时间:2015-10-08 20:09:43

标签: ios objective-c segue

我的应用程序上的初始视图控制器是为登录用户显示的UITabBarController。

但是,对于新用户,我的应用代理会首先将他们指向登录/注册视图控制器:

// New user, show login
self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];

当用户完成登录/注册后,我会将用户发送到标签栏:

// Login done, go to main view
[self performSegueWithIdentifier:@"userLoginToMainSeg" sender:self];

然而,这样做,LoginViewController没有被释放(dealloc没有被调用)。

有人可以在我的逻辑中解释错误吗?

1 个答案:

答案 0 :(得分:0)

你的模态segue基本上是这样做的:

[[],{"user_id":"77","crtloc_lat":"34.769638","crtloc_lng":"72.361145"},{"user_id":"76","crtloc_lat":"34.769566","crtloc_lng":"72.361031"},{"user_id":"87","crtloc_lat":"33.697117","crtloc_lng":"72.976631"},{"user_id":"86","crtloc_lat":"33.697117","crtloc_lng":"72.976631"}]

这意味着[loginViewController presentViewController:mainViewController animated:YES completion: ...]; 成为mainViewController s loginViewController

presentedViewController

当您为presenting a view controller时,呈现视图控制器仍保留在视图控制器层次结构中,以便您稍后可以通过调用导航回来:

loginViewController.presentedViewController == mainViewController
mainViewController.presentingViewController == loginViewController

因此[loginViewController dismissViewControllerAnimated: ...]; 未被释放是完全正常的,因为它仍然是窗口的loginViewController。只有rootViewController被提交的loginViewController阻挡。

如果您要根除mainViewController,可以直接设置loginViewController,但这不会为转换设置动画。你可以实现动画by messing around the view controllers' views,但它在官方认可的领域之外......

IMO最干净的解决方案是实现一个基本container view controller,它将成为您的窗口window.rootViewController,并且可以通过设置动画来协调rootViewControllerloginViewController之间的转换观看,然后扔掉mainViewController。它将是一种原始的导航控制器,没有导航栏和导航堆栈 - 只需用新的控制器交换当前的视图控制器,然后扔掉前者。