我的代码中有一些奇怪的问题,我无法弄清楚并需要一些帮助。我在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");
}
....}
使用第一种方法,我看到“test”打印几次然后停止。
我认为通过将motionManager保留为属性,我不必担心它会被释放但是它似乎已经被释放到了某个地方(或者你认为其他事情正在发生?)。
非常感谢你的帮助。