2013-03-20 63 views
4

我試圖在攝像頭拍攝照片之前連續檢查加速計的讀數。我有一個拍攝照片的功能,並且在該功能的開始階段,我檢查加速計讀數是否過高。如果是,我想再次調用該函數來檢查加速是否停止。Objective C遞歸調用

- (void)takePicture { 

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

    else { 
     // Code that takes picture 
    } 
} 

我想我遇到的問題是函數被遞歸調用的次數太多,我得到「EXC_BAD_ACCESS(代碼= 2)」。我該如何解決這個遞歸調用問題?

+0

添加您聲明'加速'的代碼。 – 2013-03-20 19:54:35

+0

請粘貼代碼... – 2013-03-20 19:55:26

回答

8

調用[self takePicture],將最終重試立即,這是無用的,浪費的,因爲你甚至沒有時間讓您的應用程序接收額外的加速度計事件。在您用完堆棧之前,accelerating的值可能永遠不會更改。

你可能想要在這裏做的是有一種方法稱爲一分之一秒後,例如,

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

這將使事件循環再次調用您的方法10毫秒(0.01秒)。

+0

是的,你是對的。非常感謝你! – SeilerH 2013-03-20 20:08:21

+1

然後,它再次計劃當前運行循環中的大量計時器。調用+ cancelPreviousPerformRequestsWithTarget並將其重構爲2個方法會更有效率。 – CodaFi 2013-03-20 20:36:06

+0

@CodaFi:這是一個很好的觀點。或者,採取措施(在用戶界面中)取消激活「拍攝照片」按鈕直到成功拍攝照片爲止可能是有意義的。 – duskwuff 2013-03-20 20:37:58

3

實施,這將是通過重寫制定者加速到像這樣的潛在更好的方式:

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