在我的一个应用程序中,我正在进行大量涉及数组和绘图的计算。计算涉及用户输入,有时,如果用户输入疯狂值,应用程序将继续执行计算,直到它占用太多内存并被杀死。当用户再次尝试打开应用程序时,它将尝试上次保存的数据中的相同计算,并将再次崩溃。用户需要删除并重新下载应用程序才能恢复默认值。
要解决此问题,我想在应用程序因内存不足而被杀死时转储所有已保存的数据。我已尝试在我的appDelegate中实现applicationDidReceiveMemoryWarning:
,并在viewController中实现计算正在进行的didReceiveMemoryWarning:
。这两个函数都没有被调用。在researching a bit之后,我发现这是因为我阻止了主运行循环。
我怎样才能最好地处理这种情况?
答案 0 :(得分:1)
你基本上不应该阻止主运行循环。您可以阻止用户界面(使用模态加载屏幕或类似界面),但是如果您阻止主运行循环,那么您可以自行设置各种问题。
有很多方法可以将您的工作转移到辅助线程 - 最简单/最高级别的选项之一是使用performSelectorInBackground:
。如果你需要更多的有限控制,你可以使用NSOperation
和NSOperationQueue
,或者一直到GCD(希望你不需要达到这个低级别)。
将工作放在辅助/后台线程上的另一个好处是,如果看起来花费的时间过长,可能会让用户取消操作,可能是通过“取消”按钮。当用户点击此按钮时,您可以取消正在进行的操作,并避免首先发生这些内存警告。
但不要忘记任何UI工作都需要在主线程上发生。因此,一旦完成处理,请确保在主线程上更新图形本身(使用performSelectorOnMainThread
等)。