1

我的代码中有一些奇怪的问题,我无法弄清楚,需要一些帮助。我在我的 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 保留为属性,我不必担心它会被释放,但它似乎正在某个地方被释放(或者你认为还有其他事情发生吗?)。

非常感谢您的帮助。

4

0 回答 0