UIViewController 没有释放自己

Ale*_*kov 5 objective-c uiviewcontroller ios automatic-ref-counting

我正在开发一个应用程序,根据它的状态更改它的 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;
}
Run Code Online (Sandbox Code Playgroud)

要切换回来,我从提供的 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"];

}
Run Code Online (Sandbox Code Playgroud)

问题: rootViewController 已更改,但前一个未释放。它停留在应用程序的“背景”上——当 VC 更改为另一个时,我可以看到它。

问题是如何正确释放它?非常感谢!

mat*_*att 4

这里真正的问题是您正在更改窗口的根视图控制器。不要那样做。您应该设置一次,并且永远不要再设置一次。应用程序的生命周期中应该只有一个根视图控制器。

寻找另一种架构来显示正确的视图控制器并根据需要在它们之间切换。例如,它们可能都是根视图控制器的子级,或者一个可能是另一个视图控制器之前呈现的视图控制器。