Ios 目标C递归调用

Ios 目标C递归调用,ios,objective-c,recursion,Ios,Objective C,Recursion,在相机拍照之前,我一直在检查加速度计的读数。我有一个拍摄照片的功能,在该功能启动时,我检查加速度计读数是否过高。如果是,我想再次调用该函数,检查加速度是否停止 - (void)takePicture { if (accelerating == YES) { [self takePicture]; } else { // Code that takes picture } } 我想我遇到的问题是函数被递归调用的次数太多,以至于我

在相机拍照之前,我一直在检查加速度计的读数。我有一个拍摄照片的功能,在该功能启动时,我检查加速度计读数是否过高。如果是,我想再次调用该函数,检查加速度是否停止

- (void)takePicture {

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

    else {
        // Code that takes picture
    }
}

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

实现此功能的一种可能更好的方法是覆盖setter,以加速到如下状态:

- (void)setAccelerating:(BOOL)accelerating {
    _accelerating = accelerating;
    if (accelerating) // maybe some more conditions, but you get the idea
        [self takePicture];
}

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

在这里,您可能希望在几分之一秒后调用该方法,例如

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

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

在您声明的
加速的位置添加代码。
请粘贴代码…然后,这将在当前运行循环中安排大量计时器。调用
+cancelPreviousPerformRequestsWithTarget:
并将其重构为两个方法将更加有效。@CodaFi:这是一个很好的观点。或者,采取措施(在UI中)停用“拍照”按钮,直到成功拍摄照片,这可能是有意义的。似乎这一切都可以归结为一个while循环。不需要高水平的训练<代码>同时(加速){}[自拍]应该工作得很好(如果是“阻塞”)@CodaFi:您假设另一个线程正在更新
加速。可能不是。while循环将阻止在该线程中运行的run循环(如果有的话)。