ios:更改 window.rootViewController 和内存管理

Posted

技术标签:

【中文标题】ios:更改 window.rootViewController 和内存管理【英文标题】:ios : change window.rootViewController and memory management 【发布时间】:2012-10-16 14:27:19 【问题描述】:

我面临以下问题:我的应用程序有两个主控制器 (a)loginController 和 (b) contentController,当应用程序启动时,我检查用户是否已登录,如果是,则显示 contentController,否则显示登录控制器。所以基本上在 didFinishLaunchingWithOptions 中,我将此控制器之一分配给 window.rootViewController。问题是当我想从一个控制器切换到另一个控制器时(因为用户进行了登录或注销)来完成此操作,我使用以下代码:

[UIView transitionWithView:self.window
                  duration:0.65
                   options:UIViewAnimationOptionTransitionFlipFromLeft
                animations:^
                    self.window.rootViewController = self.contentController;
                
                completion:^(BOOL finished)
                    [self.loginController release];
                ];

在此过渡 window.rootViewController 为 loginController 之前,这里的问题是执行此代码时收到以下错误:

-[loginController _preferredInterfaceOrientationGivenCurrentOrientation:]: message sent to deallocated instance 0x1c55b490

我想了解如何在不出现此错误的情况下释放我的控制器。 如果有人能建议我在运行时更改 window.rootViewController 的最佳方法是什么,那就太好了。

【问题讨论】:

可能是因为 viewWillDisappear: 和 viewDidDissappear: 没有像this answer 中解释的那样被调用吗? 【参考方案1】:

如果不查看更多代码,就无法确定您遇到内存管理问题的原因。但我想提供一个不同的答案。让您的内容控制器始终成为窗口的根控制器。如果您需要显示登录屏幕,请将其显示为内容控制器上的模式视图控制器。这将比切换根视图控制器容易得多。您可以在启动时不显示动画,因此用户永远不会看到它的过渡。登录后,您可以取消任何显示其下方内容控制器的方法。如果用户注销,您可以再次显示登录控制器,作为内容控制器上的模式控制器。

【讨论】:

感谢您的回答,但您提出的解决方案不适合我的应用架构。要呈现模态控制器,我必须等待 viewDidAppear 不,您可以从另一个视图控制器的 viewDidLoad 方法呈现模态视图控制器。用户永远不会看到第一个控制器。 是的,你是对的,无论如何这种方法并不能解决我的内存管理问题,有时只有一个视图控制器层次结构

以上是关于ios:更改 window.rootViewController 和内存管理的主要内容,如果未能解决你的问题,请参考以下文章

iOS滑块更改颜色更改错误标签

iOS 更改页面时如何动态更改 PageControl 颜色?

MongoDB 更改流与 socket.io

iOS 7导航栏后退按钮标题在语言更改时更改

内存映射 IO - IO 设备如何知道值已更改?

更改 iOS 应用本地化运行时间