0

何が起こっているのか正確にはわかりません。答えを見つけるのに十分な関連コードを提供できることを願っています。appDelegate.mでジェスチャレコグナイザーを設定しました。

CCScene *scene = [HomeLayer scene];
HomeLayer *layer = (HomeLayer *) [scene.children objectAtIndex:0];

UIPanGestureRecognizer *gestureRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:layer action:@selector(handlePanFrom:)] autorelease];
[director_.view addGestureRecognizer:gestureRecognizer];
m._gestureRecognizer = gestureRecognizer;

アプリがクラッシュするポイントを特定するために、いくつかのデバッグメッセージを挿入しました。

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer {
    NSLog(@"Handle Pan From");

ccTouchBegan / Moved/Endedのいくつかのプリントアウトと同様に。

アプリがクラッシュするたびに、物事が「動いている」間(終了は呼び出されません)、handlePanFromも呼び出されません。

背景情報:私のアプリには、シーンを切り替えるために使用するボタンがあります。例:

- (void) doSomethingThree: (CCMenuItem  *) menuItem
{
    NSLog(@"The third menu was called");
    [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:1.0 scene:[HomeLayer scene] ]];
}

アプリを起動してHomeLayerシーンに直接移動し、ドラッグしようとすると、アプリは100%の確率で即座にクラッシュします(ccMovedはクラッシュする前に1〜2回呼び出されます)。クリックしてもアプリはクラッシュせず、handlePanFromを呼び出すものだけがクラッシュします。

奇妙なことに、他のシーンをドラッグしてもアプリはクラッシュせず、handlePanFromが正常に呼び出されます。次に、HomeLayerシーンに戻ってドラッグすると、しばらくの間クラッシュしません。これは、別のシーンでドラッグするのに費やした時間に直接関係しているようです。

誰かが以前にこれらの症状を見たことがありますか?私が提供した情報が適切であるか正しいかはわかりませんが、私はまだiphonedevを回避する方法を学ぼうとしています。デバッグのヒントも喜んでいます(16進線のように見えるアセンブリは、私にとって特に啓発的ではありません...)

4

1 に答える 1

1

NSZombiesの助けを借りて問題を理解し、割り当て解除されたメソッドhandlePanFromを参照しようとしたときにプログラムがクラッシュしていたことを発見しました。

問題の最終的な原因は、HomeLayerが2回インスタンス化されていたことでした。1回目はappDelegate.mで、2回目はreplaceSceneを実行していました。

これにより、最初のレイヤーは最終的にすべての参照を失い、gestureRecognizerがまだ[layer handlePanFrom]を参照しようとしている間に割り当てが解除され、クラッシュが発生しました。

この問題は、gestureRecognizerをappDelegate.mからHomeLayer.mに移動することで修正されました。複数のレイヤーにまたがるジェスチャーが必要な場合は、gestureRecognizerの既存の参照をビューに削除してから、レイヤー内のメソッドを対象とする新しいもの:

+(CCScene *) scene
{
    HomeLayer *layer = [HomeLayer node];

    [scene addChild: layer];

    for (UIGestureRecognizer *gr in [[CCDirector sharedDirector].view gestureRecognizers]) {
        // note that sharedDirector is a singleton and therefore is the same CCDirector
        // as the one used in appDelegate.m
        [[CCDirector sharedDirector].view removeGestureRecognizer:gr];
    }

    UIPanGestureRecognizer *gestureRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:layer action:@selector(handlePanFrom:)] autorelease];

    [[CCDirector sharedDirector].view addGestureRecognizer:gestureRecognizer];

    return scene;
}

うまくいけば、それはビュー内の複数のシーン/レイヤーで作業しようとしている将来の誰かを助けるかもしれません=)

于 2013-01-29T06:48:30.883 に答える