Iphone UITableViewController的应用程序变得非常无响应

Iphone UITableViewController的应用程序变得非常无响应,iphone,objective-c,ios,Iphone,Objective C,Ios,我注意到,我的整个应用程序在使用一点之后变得非常无响应。我打开仪器,决定做一些测试,主要是关于内存和CPU的使用。我将我的应用程序与推特应用程序进行了比较,因为推特应用程序既使用了UITableView,又使用了tableView中的图像,与我的应用程序非常相似。我对仪器完全不熟悉,所以我必须用我对iPhone工作原理的基本理解来理解每件事的含义 我的内存使用似乎很好,因为这两个应用程序惊人地相似。我的应用程序在大量使用后,在这个阶段非常落后:真实内存:55.63,虚拟内存:152.03。推特:

我注意到,我的整个应用程序在使用一点之后变得非常无响应。我打开仪器,决定做一些测试,主要是关于内存和CPU的使用。我将我的应用程序与推特应用程序进行了比较,因为推特应用程序既使用了
UITableView
,又使用了tableView中的图像,与我的应用程序非常相似。我对仪器完全不熟悉,所以我必须用我对iPhone工作原理的基本理解来理解每件事的含义

我的内存使用似乎很好,因为这两个应用程序惊人地相似。我的应用程序在大量使用后,在这个阶段非常落后:真实内存:55.63,虚拟内存:152.03。推特:真实:58.42,虚拟:192.89。尽管使用了更多的内存,Twitter应用程序仍然非常灵敏(我不会说是超级灵敏,仍然有一些紧张的时刻)。关闭后,我转到CPU

这就是奇怪的地方。Twitter应用程序使用非常少的CPU(尽管它比我的应用程序稍微密集)。当什么都没有发生时,CPU使用率下降到~0%。它跳了好几次,这与应用程序变得有点滞后是一致的。然而,我的应用程序是一个巨大的CPU猪!当什么都没发生时,我的应用程序会使用100%的CPU,大约80%-100%。换句话说,当读取Activity Monitor仪器上的条形图时,
UITableView
处于空闲状态时,系统负载不会降低,而Twitter应用程序正是这样做的

因此,我决定这就是应用程序变得无响应/滞后的原因。问题是,我不知道如何补救

这就是我能想到的:
-我做了大量的异步网络请求。然而,这并不能解释为什么CPU使用率保持不变,因为请求通常在一秒钟内完成,JSON很快就会下载并解析。
-我在每个单独的网络请求完成后重新加载TableView。但是,如上所述,这是在下载最后一个JSON的同时完成的,因此没有理由会导致CPU使用率急剧上升。
-在我的计算单元配置中进行了大量计算。然而,和前两个一样,这并不能解释太多


即使切换到
UIViewController
时,高负载仍然存在。
UIViewController
是启动视图控制器,当应用程序首次启动时,它的负载为0%,并无限期保持在0%。仅当加载
UITableViewController
时,加载才会跳起来,然后保持如上所述。因此,这种巨大的CPU使用必须来自
UITableViewController

有人有什么想法吗?对不起,这是一堵巨大的文字墙。如果你需要我发布任何代码,只要问我就行了

谢谢你的帮助,
问候,
迈克

我做了大量的异步网络请求。然而,这并不能解释为什么CPU使用率保持不变,因为请求通常在一秒钟内完成,JSON很快就会下载并解析

通常他们使用相反的方法:一个做得很好的应用程序,比如Twitter,使用一个服务器,当某个东西被更新时,会向应用程序发送通知


签出。

在调试器中运行您的应用程序,并在缓慢时随机停止它。然后检查所有不同的线程都在做什么。你可能很快就会发现一些你意想不到的事情,并可能是罪魁祸首

只需点击调试器中的暂停按钮,然后展开所有线程以显示调用堆栈。如果线程的调用堆栈仅显示iOS的函数和方法,则可以忽略它。但是如果它显示了你的应用程序的一些方法,那么你想点击这些方法并进行调查:为什么该方法当前正在运行?为什么卡在这条线上


这是一种穷人的性能调试方法。先进的方法是使用仪器。

UITableViewController
是世界上最愚蠢的东西,它几乎不需要任何CPU。它被广泛使用,不会造成太多问题。在异步代码中添加一些日志记录,以查看当您认为它确实完成时,它是否真的完成了。@dasblinkenlight我使用AFNetworking来完成异步请求。在完成块中,我执行NSLog。请求完成得非常快。请在调试器中运行应用程序,并在速度较慢时随机停止它。然后检查所有不同的线程都在做什么。你可能很快就会发现一些你没有预料到的事情,并且可能是罪魁祸首。@Codo这是个好主意。不幸的是,我并没有特别的经验,所以很难理解线程部分抛出的所有gobbledygook。这很简单:只需点击调试器中的暂停按钮,然后展开所有线程以显示调用堆栈。如果线程的调用堆栈仅显示iOS的函数和方法,则可以忽略它。但是如果它显示了你的应用程序的一些方法,那么你想点击这些方法并进行调查:为什么该方法当前正在运行?为什么卡在这条线上?等