问题描述
||
我有一个基于导航的iPhone应用程序。在应用程序中间,有时我会收到内存警告级别1和2。突然之间,我从数据库中获取并基于根Viewcontroller中用户输入创建的所有值(包括我保存在nsuserdefaults中的值)完全丢失了。当我尝试返回到根视图控制器时,我的表视图为空,没有任何数据。
如何处理此问题,请提出任何解决方案?
解决方法
这就是它的工作方式,“很不幸”。当“ 0”进入时,您的视图被释放,这解释了为什么您在表中找不到任何值。
根据Apple Docs的说法,应该准备再次创建所有视图。
此方法的默认实现检查视图控制器是否可以安全地释放其视图。如果视图本身没有超级视图,并且可以从nib文件或使用自定义loadView方法重新加载视图,则可以这样做。如果可以释放视图,则此方法将释放它并调用viewDidUnload方法。
您可以根据需要重写此方法,以释放视图控制器使用的任何其他内存。如果这样做,请确保在某个时候调用super实现,以允许视图控制器释放其视图。在iOS 3.0及更高版本中,如果视图控制器持有对视图层次结构中对象的引用,则应改为在viewDidUnload方法中释放这些引用。在iOS的早期版本中,您应继续通过此方法释放它们。有关如何安全释放插座和其他对象的信息,请参见viewDidUnload方法中的讨论。
如果要实施这些准则,则可以采取以下方法:
使用
viewDidLoad
/viewDidUnload
来“保存/恢复”您的数据;
将数据存储在独立于您的视图的模型中;
在viewDidUnload
中(警告后调用),在控制器中存储有关视图状态的足够信息(即,如果它正在显示有关客户及其客户/ ID的数据),那么您可以通过从以下位置获取数据来重新创建该信息该模型;
在viewDidLoad
中,当在出现内存警告后恢复视图时也调用该视图,请使用您保存在视图控制器中的信息(如果有的话),以精确的状态重新创建视图(否则,将其放入默认状态)。
这应该很容易。
如果对您有意义,则可以部署的一个技巧是:
在视图控制器中覆盖-didReceiveMemoryWarning
;
对于确实不想自动释放的任何视图,请不要在-didReceiveMemoryWarning
覆盖中调用[super didReceiveMemoryWarning]
。
当心,这将使您现在的生活更轻松,但也将破坏苹果公司为恢复内存而采用的重要机制。这本身不会导致崩溃,但是如果您管理许多视图或视图占用大量内存(大量图形等),则可能会使设备内存填满并突然关闭应用程序。所以,您的判断在这里...