看了一下苹果关于电池消耗的文档,可是说是一些tips,将tips翻译出来,给自己看看。
1. CPU
1. 减少使用polling 轮询?
2. 避免取消屏幕一直亮着的情况。
3. 合并工作,减少CPU的一直做小的工作 ?? 不太明白 - 避免频繁的访问硬件
4. 重绘视图的频率不要过快 - 如果用了accelerometer,同一个区块就不要再使用事件。只需要按需加上event事件。
2. WIFI 蓝牙 3g、4g
传输的网络数据越多,就需要耗费更多的电量。执行网络交互是耗电最密集的操作。我们在编写代码遵循以下方式来减少网络过程中的电量消耗。
1. 只有在需要时链接额外的网络服务;不要不停的尝试连接这些服务。
2. 当必须要网络连接时,避免传递不需要的数据内容。
3. 快速发送数据,而不是慢慢发送数据,更短的时间内发送同一个数据包比长时间发送相同内容的数据包更节省电。
4. 使用NSURLSession类时,将上传任务和下载任务排序,(不要等一个任务完成再开始下一个任务),系统会对自动进行优化操作。
5. 尽量使用WIFI来使用网络,使用更小的电量,它的优先级高于使用蜂窝无线网络。
6. 如果你使用Core Location framework来收集位置信息,尽快禁用位置更新,并把距离过滤器和精度级别设置到适当的值。
注:可以通过使用Instruments来查看App的状态。
3. 定位
4. 加速器?
5. 硬盘
有效的使用存储空间鼓励使用更小的内存,所以可以在后台保持更多的APP。系统拥有更小的内存空间,更容易出现内存问题。为确定一直有足够的内存空间可以使用,应该最小化APP的内存使用,并且可以对系统提出的需要释放内存的需求作出响应。
观察低内存的警告
如果系统配发低内存警告,对其马上进行处理,低电量的警告是一个可以让你消除不需要的对内存空间的机会。忽略这些警告会使app终止。系统提供一下几种API方便你处理低内存问题。
1. applicationDidReceiveMemoryWarning AppDelegate
2. didReceiveMemoryWarning ControllerView
3. UIApplicationDidReceiveMemoryWarningNotification notification- DISPATCH_SOURCE_TYPE_MEMORYPRESSURE. 这部分相关的文献没看过,dispath_source的内容估计下周才会看。
接收到警告信息应该马上释放不需要的内存空间(什么是不需要的内存空间)。使用警告来清除缓存和释放图片。如果有大的数据结构还未被使用,将这些数据存放在disk中,然后在删除堆中的数据。如果数据模型中包含可清除的资源,可以使用通知的方式来清除强指针。
>可以使用模拟器的Memory Warning来测试App对内存处理的行为。
减少App的内存占用下面是一些tips来减少内存占用。
1. 清除内存泄露
2. 使资源文件尽可能地小
3. 使用CoreData 或者 Sqlite来存储大的数据- 用懒加载的方式加载资源#### 合理的分配内存下面是一些提高内存使用的tips
4. 对资源大小进行限制。(啥意思??)
5. 避免不受控制的问题集。会导致处理问题集的大小未知。如果问题集的处理内存的大小超过了App的内存空间,会导致处理异常。
优化网络代码
iOS网络堆栈包含与设备硬件相连接的接口,其主要接口是CFNetwork framework,它是建立在BSD和 Core Foundation framework 的网络层实例。还可以使用NSStream类 和 low-level BSD sockets。 发送和接收网络数据是设备最消耗电量的操作之一。最小化传递和接收数据的时间可以帮助提升电池寿命。为满足这个问题,可以使用以下的方式:
1. 定义数据格式越紧凑越好?
2. 避免使用非正式协议。
3/ 任何时候都快速发送数据包。
当程序不活动的时候,蜂窝网络和WIFI被设计为关闭。虽然使用无线广播会花费几秒事件。如果你的app每隔几秒发送一次数据,无线广播会一直开着,即使它并没有做任何事,它也会并消耗电量。所以更适合一次传递大量的数据或者每隔一定间隔发送数据。当和网络沟通的时候,数据包可能随时丢失。因此当写网络代码时,需要使网络代码足够健壮保证能对错误进行处理。应该合适的响应各种网络情况,但是也会出现处理不一致的情况。
使用WIFI
如果你的APP允许接入网络,必须在Info.plist中进行定义,包含 UIRequiresPersistentWiFi。它可以让系统不要在APP运行阶段关闭无线网络硬件。
为防止无线网络硬件消耗太多电量,iOS系统会在没有APP需要使用UIRequiresPersistentWiFi之后的30mins关闭网络硬件。如果APP的运行使用了UIRequiresPersistentWiFi,在APP的生命周期中系统会有效的持续时间计时器。
飞行模式提醒
如果APP在设备处于飞行模式的时候启动,系统可能会通知APP这个事件。系统只会在满足以下所有条件才会对前台进行通知。
1. App中设置了UIRequiresPersistentWiFi并且值为true。
2. APP启动时,系统处于飞行模式。
3. 在设置成飞行模式后,设备的WIFI不能正常的手动切换。
提高文件管理
减少数据写入沙盒中文件的操作是相对缓慢的,涉及到将内容写到寿命有限的闪存驱动器中。下面帮助减少文件操作的tips。
1. 只编写更改的文件的部分,并在可以的时候进行聚合更改,避免写了整个文件只修改几个bite的操作。
2. 在定义文件格式时,以组的方式进行修改,以最小化每次需要写入disk的块的总数。
3. 如果数据包含随机访问的结构化内容,使用CoreData或者Sqlite,特别是在一些大的数据条件下。避免将缓存文件写入磁盘。只有在APP退出,但是需要将此次的数据状态保存,使下一次启动时有相同的状态。
使应用程序备份更加有效
备份可以通过iCloud无线传输或者通过iTunes同步备份。过程中,文件将转移到电脑或者iCloud账号。沙盒数据决定了是否恢复、备份数据。如果您的应用程序创建了许多大型文件,这些文件经常发生变化,并将它们放到一个备份的位置,结果可能会减慢备份速度。
把工作从主线程移走
确认只有有限类型的工作可以在主线程中完成。主线程是用户事件处理和其他输入的地方。为确保能够又一个良好的交互,不应该在主线程中放入需要花费大量时间去处理的任务。比如网络。应该总是将这些任务放在线程中执行。GCD和NSOperation是很好的处理异步任务的方式。
将任务移至后台可以使主线程处于空闲状态,在APP开始或者退出时,需要在短时间内响应用户行为。如果主线程在启动阶段堵塞,在结束启动之前,系统会杀死APP。如果主线程在APP退出的阶段堵塞,可能会在写入缓存前杀死APP。