iOS设备的资源有限,没有足够的内存能让很多应用同时运行,电池续航时间也很宝贵,所以让设备把能量用在用户真正关心的活动上是至关重要的,一个后台运行的“忙等”应用能在很短时间耗尽电池电量,但是用户也希望应用能迅速就位,它们希望能够无缝的切换应用,优秀的ios应用给用户的感觉是它们总是在运行,而且运行所需的资源越少越好。
但是很多用户需要的东西不能用感觉来实现,比如用户在运行其他应用的时候能下载文件,像在启动时新闻订阅就能够得到更新,每个ios版本发布后,应用都能获得更多的后台运行权限,ios7 加入了重要的新特性,能让你在后台下载文件,并且在任意时间用静默通知唤醒应用。
从ios4开始,苹果开始支持第三方应用在后台运行受限运行,这延续了苹果不允许第三方应用影响系统性能和浪费系统资源的一贯传统,ios始终以应用而不是以开发者为中心,但是应用应该让用户感觉一直在运行,即使实际上不是这样,应用可能会在挂起状态下没有收到任何警告就终止运行了,但在下次运行时,它再次运行时,它应该让用户感觉与上次退出时没有任何不同,一是不要在加载过程中显示启动画面,二是要在应用进入后台运行时把必要的状态保存下来,以便应用终止之后再次唤醒时能够恢复用户离开时的状态。
在进入后台运行时,减少应用的内存占用是非常重要的,这样也可以将唤醒应用所需的时间降到最少。如果丢弃缓存信息,那么唤醒应用跟重启应用所需的时间差不多,也就没有必要挂起应用了,一定要想清楚可以丢弃哪些对象,以及需要多少时间重新创建这些对象,每一项操作都会消耗电量,即使它们不会使应用明显变慢,也一定要避免不必要的处理。
应用挂起后无法收到内存警告,如果内存占用量比较大,那么系统很可能会在出现内存压力时终止应用,而你对此毫无办法,处理这个问题时,NSCache和NSPurgeableData能够大显身手,NSPurgeableData使一个NSData对象,可以将它编辑为当前正在使用或者可清除,如果把它保存到NSCache对象中并使用endContentAccess将其标记为可清除,ios会在遇到内存压力之前一直保存它,遇到内存压力时,ios就会丢弃这些数据,即使这时应用处于挂起状态,这样一来,用户每次短暂离开又回到应用时,就不需要丢弃这些对象然后重新创建,但必要时仍然会丢弃这些数据。
应用进入后台运行之后,许多框架数据都是自动管理的,使用imageNamed:方法加载的图片数据会被自动丢弃,再次使用时会重新从磁盘加载,这个规则有一个重大的例外:UIImageView不会丢弃数据,因而会占用大量的内存,如果UIImageView中有非常大的图片,通畅应该在进入后台运行之前把它删除。
在instrument中可以看大两种内存:脏内存,常驻内存进入后台运行时,不能被ios自动回收的内存就是脏内存,常驻内存就是当前使用的所有内存,在不同的情况下,这两种内存都很重要,减少内存的占用量可以降低应用在后台被终止的可能性,应优先考虑减少脏内存占用量,当应用不在前台运行时,应该尽可能减少资源消耗,NSCache和 NSPurgeableData可以用来减少脏内存占用,减少常驻内存可以防止应用在前台运行时收到内存过低警告。
内存很重要,但并不是唯一的资源,应该避免过多的网络活动,磁盘访问,以及其他任何浪费电量的操作。在后台运行时,有些操作是禁止的,最重要的OpenGL调用,应用在后台运行时必须停止更新OpenGL视图,还有一个微妙的问题就是应用终止。