ios – CoreMotion崩溃(仅适用于iPad)调用stopDeviceMotionUpdates

ios – CoreMotion崩溃(仅适用于iPad)调用stopDeviceMotionUpdates,第1张

概述我们在我们的应用程序中有一个CMMotionManager的实例,用于以5Hz的频率获取传感器更新.以下是我们用于启动运动更新的代码: [self.motionManagerstartDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXMagneticNorthZVerticaltoQueue:operationQu 我们在我们的应用程序中有一个cmmotionmanager的实例,用于以5Hz的频率获取传感器更新.以下是我们用于启动运动更新的代码:

[self.motionManagerstartDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXMagneticnorthZVerticaltoQueue:operationQueuewithHandler:^(CMDeviceMotion *motion,NSError *error) {if (!error) {    [self doSomethingWithMotion:motion];} else { ... }

上述方法总是在主线程上调用.

现在,一旦我们完成了我们的任务,我们通过在主线程上再次调用以下方法来停止运动更新:

- (voID)stopMotionUpdates {    // This might get called on concurrent threads.    // So better using sync block + make it IDempotent    @synchronized(self) {        if (_motionManager.deviceMotionActive) {            [_motionManager stopDeviceMotionUpdates];            _prevPoint = nil;        }    }}

我们面临的问题是stopMotionUpdates崩溃,也只是在iPad.我们已经在iPhone和iPad上使用不同的 *** 作系统版本进行了广泛的测试,我们只能在iOS7和iOS8的iPad(mini 1,2和视网膜/非视网膜)上崩溃.此外,我们无法重现我们用于测试的所有iPad上的崩溃,但仅有少部分.以下是主要和崩溃的线程的崩溃日志:

Thread : com.apple.main-thread0  libsystem_kernel.dylib         0x00000001935f1cdc semaphore_wait_trap + 81  libdispatch.dylib              0x00000001934fbb3c _dispatch_semaphore_wait_slow + 2522  CoreMotion                     0x0000000186bf67d4 (null)3  CoreMotion                     0x0000000186be3698 (null)4  MyApp                          0x00000001002f7434 -[MyAppMotionManager stopMotionUpdates]......12 MyApp                          0x00000001002e94f8 __getdispatchTimer_block_invoke13 libdispatch.dylib              0x00000001934f3fd4 _dispatch_clIEnt_callout + 1614 libdispatch.dylib              0x00000001934f5b90 _dispatch_source_invoke + 50015 libdispatch.dylib              0x00000001934f7180 _dispatch_main_queue_callback_4CF + 24416 CoreFoundation                 0x00000001864fec2c __CFRUNLOOP_IS_SERviciNG_THE_MAIN_disPATCH_QUEUE__ + 1217 CoreFoundation                 0x00000001864fcf6c __CFRunLoopRun + 145218 CoreFoundation                 0x000000018643dc20 CFRunLoopRunspecific + 45219 GraphiCSServices               0x000000018c0ddc0c GSEventRunModal + 16820 UIKit                          0x000000018956efdc UIApplicationMain + 115621 MyApp                          0x00000001000c9850 main (main.m:14)22 libdyld.dylib                  0x000000019350faa0 start + 4EXC_BREAKPOINT UNKNowN at 0x0000000186c257acThread : Crashed: Thread0  CoreMotion                     0x0000000186c257ac (null) + 1105041  CoreMotion                     0x0000000186c25774 (null) + 1104482  CoreMotion                     0x0000000186bf3c84 (null)3  CoreMotion                     0x0000000186bf67ec (null)4  CoreMotion                     0x0000000186bf3b80 (null)5  CoreMotion                     0x0000000186c24c48 (null) + 1075886  CoreMotion                     0x0000000186bf67ec (null)7  CoreMotion                     0x0000000186c24ba4 (null) + 1074248  CoreMotion                     0x0000000186be3b9c (null)9  CoreMotion                     0x0000000186bf6860 (null)10 CoreFoundation                 0x00000001864ff680 __CFRUNLOOP_IS_CALliNG_OUT_TO_A_BLOCK__ + 2011 CoreFoundation                 0x00000001864fe838 __CFRunLoopdoblocks + 30012 CoreFoundation                 0x00000001864fd0a4 __CFRunLoopRun + 176413 CoreFoundation                 0x000000018643dc20 CFRunLoopRunspecific + 45214 CoreFoundation                 0x00000001864932a8 CFRunLoopRun + 11215 CoreMotion                     0x0000000186bf653c (null)16 libsystem_pthread.dylib        0x000000019368be1c _pthread_body + 16817 libsystem_pthread.dylib        0x000000019368bd74 _pthread_body

由于我们在运动更新处理程序块中引用了自己,因此不应该将对象重新分配到整个队列刷新.任何帮助是赞赏:)

解决方法 你可能会重载主线程.

>作为经验法则,您绝对不应该在主线程上执行任何超过或大约一秒钟的任何事情.
>主线程负责运行用户界面.如果主线程阻塞了大量的时间,用户界面将变得无法接受.
>看门狗 – 为了保持用户界面的响应,iOS包括看门狗机制.如果您的应用程序无法及时响应某些用户界面事件(启动,挂起,恢复,终止)或某些 *** 作在主线程上花费更多时间,则看门狗将会杀死您的应用程序.看门狗给你的时间没有正式记录,但总是少一些.
>任何这样的 *** 作必须在后台线程上完成,您可以轻松地使用它

> dispatch_async
> NSOperationQueue
> performSelectorInBackground

希望这可以帮助.

总结

以上是内存溢出为你收集整理的ios – CoreMotion崩溃(仅适用于iPad)调用stopDeviceMotionUpdates全部内容,希望文章能够帮你解决ios – CoreMotion崩溃(仅适用于iPad)调用stopDeviceMotionUpdates所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1085577.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存