iPad应用程序正确停止响应接口事件

时间:2011-12-21 15:01:53

标签: iphone objective-c ipad

什么可能导致应用程序停止正确响应接口事件?我面临的一个问题是我的应用程序停止执行各种动画,例如,键盘没有动画,它只是出现在屏幕上。设备的旋转不是动画,它只是在没有动画的情况下旋转。 UIAlertView在没有动画的情况下显示和解散。

我正在开发一个高性能的应用程序,每秒创建和释放几个对象。我尽量使用尽可能少的内存。我所描述的这个问题不是在内存警告之前,我没有捕获任何异常(我记录所有这些)。

如果有人能给我任何建议,我真的很感激。

Obs。:还有另一件我很好奇的事情:在我的应用中,当我遇到这个问题时,uiview动画就会停止发生。但CALayer动画正常执行。对此有解释吗?

3 个答案:

答案 0 :(得分:1)

听起来好像你正在做一些阻塞主线程的操作。所有UI都在主线程上完成,因此如果你在那里进行一些长时间的计算,这将导致UI停止响应。你在做同步网址请求吗?同样,这将阻止主线程。

您应该尽可能多地将非UI代码移动到后台线程...使用GCD或NSOperations

执行此操作

看一下Apple的Concurrency Programming Guide

Apple对NSThreads的看法......

* ...在所有情况下都可能无法远离线程,性能(以及代码的简单性)可以在您进行切换的地方显着改善。具体来说,使用调度队列和操作队列而不是线程有几个优点:

  • 它减少了应用程序为在应用程序的内存空间中存储线程堆栈而支付的内存损失。
  • 它消除了创建和配置线程所需的代码。
  • 它消除了管理和安排线程工作所需的代码。
  • 它简化了您必须编写的代码。

另外,请参阅NSThread与NSOperationQueue上的this question

答案 1 :(得分:0)

你可能通过长时间运行来阻止主线程。您是否在代码中的某处进行轮询或循环?如果你这样做(你不应该),请确保你在后台线程上这样做。

答案 2 :(得分:0)

CALayer转换更新可以具有比主线程更高的优先级,因此即使主UI线程被阻止也可以看到。但是,只要主线程被阻止,就不会发生UI更新。在阻止主线程的过程中,UI对象将被冻结。

如果您希望UI动画流畅,您的应用必须经常从所有主线程处理返回到UI运行循环(可能每秒至少30次?)。