调用控制器中的startDeviceMotionUpdatesToQueue时,我得到OSSpinLockLock
在我的根控制器中,我有一个CMMotionManager
属性
@property (strong, nonatomic) CMMotionManager *MManager;
在它的getter我做懒惰实例化。 当控制器的视图加载时,我调用这个方法
- (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
,然后立即应用程序崩溃,我得到这个线程日志
libsystem_platform.dylib`spin_lock$VARIANT$mp: 0x39a87814: movs r1, #1 libsystem_platform.dylib`OSSpinLockLock$VARIANT$mp + 2: 0x39a87816: ldrex r2, [r0] 0x39a8781a: cmp r2, #0 0x39a8781c: it ne 0x39a8781e: bne.w 0x39a893ec ; _OSSpinLockLockSlow$shim 0x39a87822: strex r2, r1, [r0] 0x39a87826: cmp r2, #0 0x39a87828: bne 0x39a87816 ; OSSpinLockLock$VARIANT$mp + 2 0x39a8782a: dmb ish 0x39a8782e: bx lr
我的错误是什么? 我把reloadAccelerometer
放在错误的地方?
我试图在我的iOS应用程序中做类似的事情,并花费一直试图弄清楚崩溃的原因是什么。 这是一个非常神秘(和讨厌)的例外。 我最终通过OSSpinLock
与线程/队列pipe理问题相关的崩溃报告进行了OSSpinLock
。
NSOperationQueue
是这里的罪魁祸首。 你的代码并不显示你是如何创build你的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); }];
事实certificate,这不是使用NSOperationQueue
。 aQueue
对象是崩溃的原因。
要正确设置操作队列并避免崩溃,应将CMMotionManager移至其他线程。 然后告诉NSOperationQueue使用currentQueue
,而不是mainQueue
。 苹果build议它不在mainQueue
上运行,但是如果你的应用程序当前正在主队列中运行,那么我看不到currentQueue
有什么不同。 我尝试使用GCD将下面的代码移到不同的队列中,但是没有任何代码被调用过。
以下是你的最终代码应该是这样的:
// Check if Motion / Location services are available if (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, NSError *error) { NSLog(@"Y values is: %f", motion.userAcceleration.y); }]; } else { // Motion / Accelerometer services unavailable }
我也应该注意到,你创buildCMMotionManager
属性(据我所知)是正确的(strong, nonatomic)
。