UIViewController没有解除分配

时间:2015-03-26 16:37:21

标签: ios objective-c uiviewcontroller 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;
}

要切换回来,我从呈现的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改变为另一个时,我可以看到它。

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

1 个答案:

答案 0 :(得分:3)

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

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