我的代码中有一些奇怪的问题,我无法弄清楚,需要一些帮助。我在我的 AppDelegate 中定义了一个 CMMotionManager。在我的视图控制器中,我定义了一个属性:
@property (nonatomic, retain) CMMotionManager *motionManager;
然后使用此代码开始更新:
- (void)startMyMotionDetect
{
motionManager = [(AppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
motionManager.deviceMotionUpdateInterval = 1.0/60.0;
[motionManager startDeviceMotionUpdates];
timer = [NSTimer scheduledTimerWithTimeInterval:20/60 target:self selector:@selector(handleDeviceMotion) userInfo:nil repeats:YES];
}
但是,handleDeviceMotion 只被调用了几次,然后它停止更新 deviceMotion 输出。我已将代码更改为推送样式(块代码),但在这种情况下,块不会被执行!块中的测试 NSLog 注释永远不会被执行。该代码如下所示:
motionManager = [(AppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
motionManager.deviceMotionUpdateInterval = 1.0/60.0;
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *dMotion, NSError *error)
{
NSLog(@"test 1");
[self performSelectorOnMainThread:@selector(handleDeviceMotion) withObject:nil waitUntilDone:YES];
}];
下面是 handleDeviceMotion 代码的样子:
- (void)handleDeviceMotion//:(CMDeviceMotion *)dMotion
{
if ([motionManager isDeviceMotionActive])
{
NSLog(@"test");
}
....}
使用第一种方法,我看到“测试”打印了几次,然后就停止了。
我认为通过将 motionManager 保留为属性,我不必担心它会被释放,但它似乎正在某个地方被释放(或者你认为还有其他事情发生吗?)。
非常感谢您的帮助。