我正在开发一个应用程序,根据它的状态改变它的rootViewController。要进行切换,我使用以下代码:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self createManagedDocumentAndContext];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *storyboardId = [userDefaults boolForKey:@"Profile Created"] ? @"User Stats" : @"Profile";
self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:storyboardId];
return YES;
}
要切换回来,我从呈现的ProfileVC中调用此方法:
- (void)returnOldRootViewController
{
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
OLDUserStatsVC *userStatsVC = [storyboard instantiateViewControllerWithIdentifier:@"User Stats"];
userStatsVC.userProfile = self.userProfile;
[currentWindow setRootViewController:userStatsVC];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:@"Profile Created"];
}
问题: rootViewController已更改,但前一个未被释放。它停留在应用程序的“背景”上 - 当VC改变为另一个时,我可以看到它。
问题是如何正确释放它? 非常感谢你!
答案 0 :(得分:3)
这里真正的问题是您正在更改窗口的根视图控制器。不要这样做。您应该将此设置为,而不是再次设置。在应用程序的生命周期中应该只有一个根视图控制器。
找到另一种架构,用于显示正确的视图控制器并根据需要在它们之间切换。例如,它们可能都是根视图控制器的子项,或者一个可能是另一个前面的呈现视图控制器。