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循环(如果有的话)。