Iphone内存警告释放从Iphone数据库检索到的所有值

Iphone内存警告释放从Iphone数据库检索到的所有值,iphone,memory-management,memory-leaks,uinavigationcontroller,Iphone,Memory Management,Memory Leaks,Uinavigationcontroller,我有一个基于导航的iPhone应用程序。在应用程序的中间,有时我正在接收内存警告级别1和2。突然,我从数据库中获取并基于root viewcontroller中的用户输入创建的所有值(包括我保存在nsuserdefaults中的值)全部丢失。当我尝试返回根视图控制器时,我的表视图是空的,没有任何数据 如何处理此问题,请建议此问题的解决方案?这就是它的工作原理,“很遗憾”。当didReceiveMemoryWarning进入时,您的视图将被释放,这解释了为什么您在表中找不到任何值 我们应该做的是准

我有一个基于导航的iPhone应用程序。在应用程序的中间,有时我正在接收内存警告级别1和2。突然,我从数据库中获取并基于root viewcontroller中的用户输入创建的所有值(包括我保存在nsuserdefaults中的值)全部丢失。当我尝试返回根视图控制器时,我的表视图是空的,没有任何数据

如何处理此问题,请建议此问题的解决方案?

这就是它的工作原理,“很遗憾”。当
didReceiveMemoryWarning
进入时,您的视图将被释放,这解释了为什么您在表中找不到任何值

我们应该做的是准备再次创建所有视图

此方法的默认实现检查视图控制器是否可以安全释放其视图。如果视图本身没有superview,并且可以从nib文件或使用自定义loadView方法重新加载,则这是可能的。如果可以释放视图,此方法将释放它并调用viewDidUnload方法

您可以重写此方法(根据需要)以释放视图控制器使用的任何其他内存。如果这样做,请确保在某个时候调用超级实现,以允许视图控制器释放其视图。在iOS 3.0及更高版本中,如果视图控制器持有对视图层次结构中对象的引用,则应在viewDidUnload方法中释放这些引用。在iOS的早期版本中,您应该继续使用此方法释放它们。有关如何安全释放插座和其他对象的信息,请参阅viewDidUnload方法中的讨论

如果您想实施这些指导原则,一个方法是:

  • 使用
    viewdiload
    /
    viewdiload
    来“保存/恢复”数据

  • 将数据存储在独立于视图的模型中

  • 在警告“后调用的
    viewDidUnload
    中,在控制器中存储有关视图状态的足够信息(即,如果它正在显示有关客户、其客户/ID的数据),以便您可以通过从模型中获取数据来重新创建该信息

  • viewdiload
    中,也在内存警告后恢复视图时调用,使用保存在视图控制器(如果有)中的信息,在视图保留的确切状态下重新创建视图(否则,将其置于默认状态)

  • 这应该使它变得很容易

    如果对您有意义,您可以部署以下技巧:

  • 覆盖视图控制器中的didReceiveMemoryWarning

  • 对于任何您确实不希望自动释放的视图,请不要在您的
    -didReceiveMemoryWarning
    覆盖中调用
    [super didReceiveMemoryWarning]


  • 请注意,这将使您的生活变得更轻松,但也将挫败苹果为恢复内存而设置的一个重要机制。这本身不会产生崩溃,但如果您管理多个视图或视图占用大量内存(大量图形等),可能会导致设备内存不足,应用程序会突然关闭。因此,您的判断…

    谢谢您提供的宝贵信息。当然,这对我帮助很大。再次感谢,我还有一个问题,如果我删除[super didReceiveMemoryWarning],它不会导致应用程序崩溃。目前,即使我丢失了内存中的值,我的应用程序也不会崩溃。请看我的编辑:我添加了正确操作的指导原则(在苹果的引用下面),以及您最后一个问题的答案。