質問

私はレベルごとに異なるコントローラを使用したゲームを開発しています。これは、加速度計を経由して手ぶれを検出する必要があるので、それはそうのようなデリゲートとして自身を登録します:

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

レベルが終了すると、このコントローラはdealloc'dと解放されます。私はUIAccelerometerのデリゲートうちnilにしなかったので、このコントローラは、(すなわち、それはまだ今解放されているオブジェクトにイベントを送信していました)解放された後に以前、私がクラッシュを得ていました。だから今、のdeallocの内側に、私はこれをやってます:

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

すべてがうまくと良好であり、最初のレベルは滞りなく果たしています。私は、次のレベルに到達新しいレベルのコントローラを作成し、(デリゲートとして新しいcontollerを設定)を再度、コードの最初のバッチを実行すると問題が起こります。この後、私は、加速度センサーからの呼び出しが届かない。

そこで問題は、あなただけの加速度センサー用のアプリにつき1つのデリゲートを持つことを許可されている、または私は何かが足りないのですか?私は、デリゲートを複数回設定する許可しないドキュメントには何も見ていません。私はOBJの-Cにやや新しいんだけど、私の知る限り、デリゲートを理解し、これはあまりにも非正統的ではありません。

注:私は3.0で、私はちょうどシェイク通知を聞くことができることを知っています。残念ながら、私は揺れに興味が全体の時間ファーストレスポンダであることを何か他のものを必要としています。だから、僕はそのオプションにリファクタリングすることはできません。

役に立ちましたか?

解決

一般的に、デリゲートを持つオブジェクトは、一度に一つだけが持っています。特に記述がない限り、特定のインスタンスの寿命にわたってデリゲートとして、複数の異なるオブジェクトを設定する上の任意の制限があってはならない。

何が起こっていることの後には、アクセルデリゲートとして第2のコントローラを設定し、のあなたの最初のコントローラがdeallocedされていることがある場合は、

私は疑問に思います。あなたが期待するために、すべてが起こっていることを確認するために、デバッガでそのコードを見たことがありますか?

他のヒント

の可能な解決策は、アプリのデリゲートおそらく、別のクラスを持っているUIAccelerometerの代理人として行動し、それがaccelerometer:didAccelerate:メッセージを受信したときに、そのクラスがカスタムNSNotificationを送る持っているだろう。あなたが気にしたり、通知を毎回送ることができると通知のuserInfoの一部としてUIAccelerationのPARAMTERが含ま加速の種類を検出するときは、どちらかだけメッセージを送信することができます。必要に応じて加速度データに興味があるあなたのコントローラが通知を登録することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top