ios – 在控制器内调用startDeviceMotionUpdatesToQueue时得到OSSpinLockLock

ios – 在控制器内调用startDeviceMotionUpdatesToQueue时得到OSSpinLockLock,第1张

概述在我的根控制器中,我有一个CMMotionManager属性 @property (strong, nonatomic) CMMotionManager *MManager; 在它的吸气器中我做懒惰的实例化.当控制器的视图加载时,我调用此方法 - (void)reloadAccelerometer { NSLog(@"Away we go"); self.MManager.devi 在我的根控制器中,我有一个cmmotionmanager属性
@property (strong,nonatomic) cmmotionmanager *MManager;

在它的吸气器中我做懒惰的实例化.当控制器的视图加载时,我调用此方法

- (voID)reloadAccelerometer {    NSLog(@"Away we go");    self.MManager.deviceMotionUpdateInterval = 10.0/60.0;    [self.MManager startDeviceMotionUpdatesToQueue:self.queue withHandler:^(CMDeviceMotion *motion,NSError *error) {        NSLog(@"Y values is: %f",motion.useracceleration.y);    }];}

我在NSLog中看到“Away we go”,然后应用程序立即崩溃,我得到了这个线程日志

libsystem_platform.dylib`spin_lock$VARIANT$mp:0x39a87814:  movs   r1,#1libsystem_platform.dylib`OsspinLockLock$VARIANT$mp + 2:0x39a87816:  ldrex  r2,[r0]0x39a8781a:  cmp    r2,#00x39a8781c:  it     ne0x39a8781e:  bne.w  0x39a893ec                ; _OsspinLockLockSlow$shim0x39a87822:  strex  r2,r1,[r0]0x39a87826:  cmp    r2,#00x39a87828:  bne    0x39a87816                ; OsspinLockLock$VARIANT$mp + 20x39a8782a:  dmb    ish0x39a8782e:  bx     lr

我的错是什么?我把reloadAccelerometer放在错误的地方吗?

解决方法 我试图在我的iOS应用程序中做类似的事情,并花了很多时间试图弄清楚崩溃的原因是什么.这是一个非常神秘(而且讨厌)的例外.在阅读了OsspinLock与线程/队列管理问题有关的崩溃报告后,我最终弄明白了.

NSOperationQueue是罪魁祸首.您的代码没有显示您是如何创建NSOperationQueue的,但我认为它是这样的:

NSOperationQueue *aQueue = [[NSOperationQueue alloc] init]; // Do NOT do this[self.MManager startDeviceMotionUpdatesToQueue:aQueue withHandler:^(CMDeviceMotion *motion,NSError *error) {    NSLog(@"Y values is: %f",motion.useracceleration.y);}];

事实证明,这不是使用NSOperationQueue的方法.那个aQueue对象是崩溃的原因.

要正确设置 *** 作队列并避免崩溃,您应该将cmmotionmanager移动到其他线程.然后告诉NSOperationQueue使用currentQueue,而不是mainQueue. Apple建议它不在mainQueue上运行,但是如果您的应用程序当前正在主队列中运行,那么我不会看到currentQueue有何不同.我尝试使用GCD将下面的代码移动到不同的队列,但是没有调用任何代码.

以下是您的最终代码应如下所示:

// Check if Motion / Location services are availableif (motionManager.deviceMotionAvailable == YES && motionManager.accelerometeravailable == YES) {    NSLog(@"Away we go");    self.MManager.deviceMotionUpdateInterval = 10.0/60.0;    [self.MManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion,motion.useracceleration.y);     }];} else {    // Motion / Accelerometer services unavailable}

我还应该注意,你创建cmmotionmanager属性(据我所知)是正确的(强,非原子).

总结

以上是内存溢出为你收集整理的ios – 在控制器内调用startDeviceMotionUpdatesToQueue时得到OSSpinLockLock全部内容,希望文章能够帮你解决ios – 在控制器内调用startDeviceMotionUpdatesToQueue时得到OSSpinLockLock所遇到的程序开发问题。

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

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

原文地址:https://54852.com/web/1109538.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存