4

我试图在相机拍照之前不断检查加速度计的读数。我有一个拍照功能,在该功能开始时,我检查加速度计读数是否太高。如果是,我想再次调用该函数以检查加速是否停止。

- (void)takePicture {

    if (accelerating == YES) {
        [self takePicture];
    }

    else {
        // Code that takes picture
    }
}

我想我遇到的问题是该函数被递归调用太多次,以至于我得到“EXC_BAD_ACCESS(代码= 2)”。如何解决这个递归调用问题?

4

2 回答 2

8

调用[self takePicture]它最终会立即重试,这是无用且浪费的,因为您甚至没有给您的应用程序任何时间来接收额外的加速度计事件。accelerating在你用完堆栈之前,的值可能永远不会改变。

您可能想要在这里做的是在几分之一秒后调用该方法,例如

[self performSelector: @selector(takePicture) withObject:nil afterDelay: 0.01];
return;

这将使事件循环在 10 毫秒(0.01 秒)后再次调用您的方法。

于 2013-03-20T19:59:08.547 回答
3

实现这一点的一种潜在更好的方法是覆盖 setter 以加速到如下所示:

- (void)setAccelerating:(BOOL)accelerating {
    _accelerating = accelerating;
    if (accelerating) // maybe some more conditions, but you get the idea
        [self takePicture];
}
于 2013-03-20T19:57:42.387 回答