UIViewController没有被释放

5

我正在开发一款应用程序,根据其状态更改其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切换到另一个VC时,我可以看到它。

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


请查看此线程:https://dev59.com/qGUo5IYBdhLWcg3wxB3T - clearlight
“但是之前的对象没有被释放”,你怎么知道?给我展示一下 dealloc 的日志证明这一点。 - matt
当您更改根视图控制器时,我非常确定您还需要在设置新的根视图控制器之前删除窗口中的任何内容,否则旧内容将保留在那里。 - AdamPro13
@AdamPro13 这不取决于它们是弱引用还是强引用吗? - clearlight
1
除非您正在执行视图控制器保存和恢复,否则不应实现willFinishLaunching。请改用didFinishLaunching - matt
显示剩余5条评论
1个回答

4

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

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


谢谢您的回答。我知道这是一种糟糕的架构 - 我是初学者 :) 不幸的是,这是我找到的唯一选项。我需要在应用程序首次启动时呈现一个VC - 用于设置。而其他情况下则需要另一个VC。我更改了rootViewController,因为如果不这样做,它就是向用户显示的第一个视图控制器。如果您能给我提供另一种方法,我将非常感激!谢谢! - Aleksandr Shcherbakov
我已经告诉过你了。如果基本的视图控制器是用户统计信息,则将用户统计信息设置为根视图控制器。如果需要个人资料,则将其作为呈现的视图控制器放在其上;当用户完成个人资料时,只需关闭它,显示用户统计信息即可。 - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接