1

在我的一个应用程序中,我正在做很多涉及数组的计算并将它们绘制成图形。计算涉及用户输入,有时,如果用户输入疯狂的值,应用程序将继续执行计算,直到它占用太多内存并被杀死。当用户再次尝试打开应用程序时,它将尝试从上次保存的数据中进行相同的计算并再次崩溃。用户需要删除并重新下载应用程序才能恢复到默认值。

为了解决这个问题,我想在应用程序因内存不足而被终止时转储所有保存的数据。我已经尝试applicationDidReceiveMemoryWarning:在我didReceiveMemoryWarning:的 appDelegate 和进行计算的 viewController 中实现。这些函数都没有被调用。经过一番研究,我发现这是因为我阻塞了主运行循环。

我怎样才能最好地处理这种情况?

4

1 回答 1

1

你基本上不应该阻塞主运行循环。您可以阻止用户界面(使用模式加载屏幕或类似屏幕),但如果您阻止主运行循环,您将面临各种问题。

有很多方法可以将您的工作转移到辅助线程 - 最简单/最高级别的选项之一是使用performSelectorInBackground:. 如果你需要更有限的控制,你可以使用NSOperationand NSOperationQueue,或者一直到 GCD (希望你不需要得到这个低级别)。

将工作放在辅助/后台线程上的另一个优点是,如果操作似乎花费太长时间,您可以让用户取消操作,也许可以通过“取消”按钮。当用户点击它时,您可以取消正在发生的操作,并避免这些内存警告首先发生。

但是不要忘记任何 UI 工作都需要在主线程上进行。因此,一旦完成处理,请确保在主线程上更新图形本身(使用performSelectorOnMainThread等)。

于 2013-03-01T10:00:55.800 回答