我正在使用UIImagePickerController从相机拍摄照片。但是,我发现随机调用控制器(显示UIImagePickercontroller之前显示的控制器)会被卸载。我记录了viewDidUnload,确实它被调用了。当相机完成并关闭时,我的控制器的viewDidLoad将被调用,不幸的是现在所有状态都已消失。输入的文字或选中的内容将会消失。
显然,这与内存不足有关。但这种行为是正常的吗?我应该处理吗?这通常不是modalViewController的工作原理。通常你会展示并解散它,一切都应该完好无损。
在这种情况下避免数据丢失的好方法是什么?我是否应该编写一堆代码来保存完整状态?
答案 0 :(得分:3)
正在发生的事情是您的视图控制器的didReceiveMemoryWarning
正在被调用,然后由于您的视图不可见,所以它正在被卸载。
解决方案是,任何想要持久化的数据都应存储在视图控制器中,而不是存储在视图中。
您可以通过在didReceiveMemoryWarning
类中提供UIViewController
的实现来阻止这种情况发生,不调用[super didReceiveMemoryWarning]
,这是卸载视图发生了,但尝试理解正在发生的事情仍然是一件好事。
答案 1 :(得分:2)
覆盖-didReceiveMemoryWarning
是不可取的,这样UIViewController就无法解除分配视图,因为这样你可能遇到内存不足的“真正”问题,你的应用程序将被系统退出。 / p>
您真正应该做的是在-didReceiveMemoryWarning
方法中保存视图中输入数据的文本和其他位(确保调用super)。然后在-viewDidLoad
中,您可以将文本和其他位放回UI中。
这将减轻内存使用量并降低应用程序被强制退出的可能性,因为没有剩余内存。一直以来,用户都不会知道它已经消失了!
答案 2 :(得分:0)
我对上述相同问题的解决方案是在视图控制器中声明一个实例变量,如果视图被卸载,它将存储UITextView
的内容。因此,在我的viewWillDissapear
方法中,我将UITextView.text
的内容保存到我的实例变量中,并在我的viewWillAppear
方法中恢复内容。
- (void)viewWillAppear:(BOOL)animated
{
if (messageTextString != nil)
{
textEdit.text = messageTextString;
}
[super viewWillAppear:animated];
}
(无效)viewWillDisappear:(BOOL)动画 { self.messageTextString = textEdit.text;
[super viewWillDisappear:animated]; }