小编And*_*ndy的帖子

减少iOS背景位置电池使用情况

我正在开发一个理想情况下需要在后台运行位置服务的iOS应用程序.我测试了重要的位置,这不够准确.准确的位置是完美的,但这会消耗太多的电池寿命,使应用程序可行.

为了解决这个电池问题我以为我找到了一个NSTimer内部使用的解决方案UIApplication:beginBackgroundTaskWithExpirationHandler:.这会打开位置,然后立即关闭,这会触发位置更新并重置backgroundTimeRemaining.

然而,这种解决方案仍然耗费大量电池 - 每3-4小时耗电15%-20% - 即使每9分钟仅打开一秒钟.除了这个计时器之外,应用程序在后台没有运行任何其他内容.我甚至尝试在进入后台时释放所有视图,以确保没有任何东西坐着消耗电池.

检查内部仪器,我发现应用程序在此等待状态下使用0.0%的CPU和14 MB的内存.在这一点上,我对此有点不知所措,特别是因为每隔540秒运行GPS 1秒钟并不能提供明显的电池消耗减少,而不是每天24小时运行它.

我已经开始编写以下问题,这可能会导致问题,我希望有人有答案或想法......

  • 以这种方式运行应用程序会阻止手机进入某种低功耗模式吗?

  • 启动GPS会使用大量电量吗?

  • 即使关闭后,GPS还能继续运行一段时间吗?

gps location background power-management ios

17
推荐指数
1
解决办法
3910
查看次数

NSArray与C阵列性能比较

我最近一直在运行一个关于与C阵列相关的NSArray顺序或随机访问性能的研究项目.大多数测试用例都出现了,因为我预计会有一些测试用例不起作用,我希望有人可以解释原因.

从根本上说,测试包括用50k对象填充C数组,迭代每个对象并调用一个方法(内部只增加对象中的一个浮点数),测试的第二部分涉及创建一个循环,完成50k次迭代但访问一个数组中的随机对象.基本上它很简单.

为了进行比较,我正在用C数组初始化NSArray.然后通过传递给跟踪执行块所花费时间的方法的块来运行每个测试.我正在使用的代码包含在下面,但我想首先介绍我的结果和查询.

这些测试在iPhone 4上运行并包装在dispatch_after中,以缓解因启动应用程序而导致的任何剩余线程或非原子操作.单次运行的结果如下,每次运行基本相同,只有很小的变化:

===SEQUENCE===
NSARRAY FAST ENUMERATION: 12ms
NSARRAY FAST ENUMERATION WEAK: 186ms
NSARRAY BLOCK ENUMERATION: 31ms (258.3%)
C ARRAY DIRECT: 7ms (58.3%)
C ARRAY VARIABLE ASSIGN: 33ms (275.0%)
C ARRAY VARIABLE ASSIGN WEAK: 200ms (1666.7%)

===RANDOM===
NSARRAY RANDOM: 102ms (850.0%) *Relative to fast enumeration
C ARRAY DIRECT RANDOM: 39ms (38.2%) *Relative to NSArray Random
C ARRAY VARIABLE ASSIGN RANDOM: 82ms (80.4%)
Run Code Online (Sandbox Code Playgroud)

最快的方法似乎是使用"*(carray + idx)"直接访问C数组中的项目,但最令人费解的是将指针从C数组分配给目标c变量"id object =*(carry) + idx)"导致巨大的性能损失.

我认为最初可能是做参考计数的电弧,因为变量很强,所以此时我把它改为弱,期望性能增加"__weak id object =*(carry + idx)".令我惊讶的是它实际上要慢得多.

随机访问结果非常好,我根据序列结果预期,所以幸运的是没有惊喜.

因此,有许多问题:

  1. 为什么分配给变量需要这么长时间? …

objective-c nsarray ios automatic-ref-counting

12
推荐指数
1
解决办法
2215
查看次数