2

当应用程序接收到内存不足的警告消息,3种情况可能发生:iPhone - 如何处理内存不足的情况

  1. 您的应用程序刚刚启动,用户没有做什么特别的东西
  2. 应用程序正在运行,并且有一个当前上下文
  3. 应用程序是在一些运行的前后

所以,当你收到此消息,您应该以释放内存......但是,在后台?如何 ?

我的理解是:

  1. initWith .....必须设置默认的静态值。
  2. viewDidLoad必须加载任何非静态对象
  3. didReceiveMemoryWarning必须释放那些非静态对象
  4. 我看不出有什么可以/必须viewDidUnload做...

我猜有些保留值必须设置为零...在didReceiveMemoryWarning中?

对于活动的上下文(屏幕的东西,显示的文本,......的位置)必须做什么,所以当再次调用viewDidLoad时,那些东西再次出现,因为他们在memoryWarning调用之前?

我的意思是,想象情景2:

方案1

  1. 您正在使用的东西......你在现场写了一些文字,没救了它,开了另一种观点,在屏幕上移动了一个视图。
  2. 您在后台发送应用程序。
  3. 然后memoryWarning发送到应用程序。
  4. 之后,用户将应用程序发送到前台:它应该显示像退出时一样,在当前视图上显示与之前视图相似的内容,但是如果所有内容都已发布,您将如何执行此操作?

方案2

  1. 您正在使用的东西......你在现场写了一些文字,没救了它,开了另一种观点认为,移动屏幕上的视图。
  2. 然后memoryWarning发送到应用程序。
  3. 您不想松开视图中的内容,也不想放松前一视图中的内容。由于发布/重新加载功能,您不希望屏幕闪烁。你如何处理这个问题?

因此,当这些内存警告发生时,除了将事情写入磁盘以稍后显示它们之外,还有其他选择吗?

你什么时候再加载它们?我有一个viewController加载(viewDidLoad),接收memoryWarning,unloads(viewDidUnload),但回到它时,viewDidLoad不会再被调用?这是否必须在viewWillAppear中完成?我是否必须认为,随时viewWillAppear触发,我可以假设应该显示在它上的东西被加载?

任何帮助,即使有价值的链接,都会很棒!

谢谢你的帮助。

回答

1

我的想法是,当一个应用程序接收到内存不足的警告两种方法称为:

didReceiveMemoryWarning // in your NSObjects 

applicationDidReceiveMemoryWarning // in your app delegate 

那么,如果你想释放内存,这些都是方法考虑。

至于你可以做什么在那里嘛...... 想想的Xcode提示:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { 
    /* 
    Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later. 
    */ 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

貌似,最好的choise会释放任何物体不能被用户看到和/或者没有使用,或者稍后可以重新创建的任何缓存数据。 不要触摸您的GUI:如果您关闭它或其中的一部分,您的应用程序将变得无法使用,用户感到失望。

关于您的两种情况,我在考虑可能发生的内存警告时发现了一个可能的错误。 他们是治疗紧急情况的一种方式,而不是管理记忆的正常方式。 开发人员必须考虑良好的内存架构并尽可能保存数据。

在场景1中,应用程序发送到后台时保存您的数据。

applicationDidEnterBackground 

在场景2中,打开新视图时保存数据。

希望这是有道理...

1

考虑替代的方案。如果您的应用没有释放足够的内存,可能会被杀死,这对用户来说会更加震撼。有人可能会选择潜在地闪烁当前显示而不是丢失用户的宝贵数据。

+0

在我的情况下,最好让应用程序在闪烁时被杀死。我没有用户数据,但ap生成的内容。这些内容丢失会更好,而不是以不平滑的方式生成。 – Oliver