1

レベルごとに異なるコントローラーを使用するゲームを開発しています。加速度計を介して揺れを検出する必要があるため、次のようにデリゲートとして登録されます。

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = kUpdateInterval; 

レベルが終了すると、このコントローラーは割り当て解除されて解放されます。以前は、UIAccelerometerでデリゲートを削除しなかったため、このコントローラーが解放された後にクラッシュが発生していました(つまり、解放されたオブジェクトにイベントを送信していました)。だから今、deallocの中で、私はこれをやっています:

UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = nil;

すべてが順調で良好であり、最初のレベルは問題なく再生されます。次のレベルに到達し、新しいレベルコントローラーを作成し、その最初のコードバッチを再度実行すると、問題が発生します(新しいコントローラーをデリゲートとして設定します)。この後、加速度計からの呼び出しはありません。

質問は、加速度計のアプリごとに1人の代理人しか許可されないのか、それとも何かが足りないのかということです。デリゲートを複数回設定することを許可しないドキュメントはありません。私はObj-Cに少し慣れていませんが、デリゲートを理解している限り、これはあまりにも非正統的であってはなりません。

注:3.0では、シェイク通知をリッスンできることを知っています。残念ながら、私はシェイクに興味を持っている間ずっとファーストレスポンダーになるために何か他のものが必要です。したがって、そのオプションにリファクタリングすることはできません。

4

2 に答える 2

2

一般に、デリゲートを持つオブジェクトには、一度に1つしかありません。特に文書化されていない限り、特定のインスタンスの存続期間にわたって、複数の異なるオブジェクトをデリゲートとして設定することに制限はありません。

2番目のコントローラーをアクセラレーターデリゲートとして設定したdealloc、最初のコントローラーが編集されているのではないかと思います。デバッガーでそのコードを見て、すべてが期待どおりに行われていることを確認しましたか?

于 2009-11-11T21:19:03.507 に答える
2

考えられる解決策は、別のクラス(おそらくアプリのデリゲート)をUIAccelerometerのデリゲートとして機能させ、accelerometer:didAccelerate:メッセージを受信したときにそのクラスにカスタムNSNotificationを送信させることです。気になるアクセラレーションのタイプを検出したときにのみメッセージを送信するか、毎回通知を送信して、通知の一部としてUIAccelerationパラメーターを含めることができますuserInfo。加速度データに関心のあるコントローラーは、必要に応じて通知に登録できます。

于 2009-11-11T21:52:26.783 に答える