4

カメラが写真を撮る前に、加速度計からの読み取り値を継続的にチェックしようとしています。写真を撮る機能があり、その機能の開始時に、加速度計の読み取り値が高すぎるかどうかを確認します。そうであれば、関数を再度呼び出して、加速が停止したかどうかを確認したいと思います。

- (void)takePicture {

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

    else {
        // Code that takes picture
    }
}

私が抱えている問題は、関数が再帰的に呼び出される回数が多すぎて、「EXC_BAD_ACCESS (code=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

これを実装するための潜在的なより良い方法は、次のようなものに加速するためにセッターをオーバーライドすることです。

- (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 に答える