0

タッチハンドラーの呼び出しを停止できない理由について、私は混乱しています。

DungeonDisplay.m で:

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    if (processing || animating) 
        return false;
    processing =  true;
    touchPoint = [self locationFromTouch:touch];
    [self schedule:@selector(keepMoving) interval:0.01];
    [self processTouchAtX:(touchPoint.x/32) AndY:(touchPoint.y/32)];
    return false;
}

-(void) processTouchAtX: (int)x AndY: (int)y
{
//    if (theDungeon.currentDungeonLevel)
         [theDungeon processTouchAtX:x AndY:y];
}

[theDungeon processTouchAtX:x AndY:y] で、DungeonDisplay インスタンスが解放され、DungeonDisplay:Dealloc が正しく呼び出されますが、関数 ccTouchBegan をステップ実行すると、最後の「return false;」の直後です。次の「ステップ」は関数「if (処理 || アニメーション化)」の先頭に戻り、次のステップでプログラムがクラッシュします。

問題が何であるかについては不明です。

どんな助けでも感謝します。

4

2 に答える 2

0

ここには十分なコードが含まれていません。ただし、タッチ イベントを受け取るデリゲートへのポインターを NIL アウトしなかったことが原因である可能性があります。何か他のものへのデリゲートであったものを処理した場合は、そのことをデリゲートではなくすることを確認する必要があります。iOS でメッセージを nil に送信しても問題ありません。解放されたオブジェクトへのポインターにメッセージを送信することはできません。

于 2012-06-22T00:16:32.100 に答える
0

DungeonDisplay が CCLayer から派生したものではなく、CCTouchDispatcher にタッチを登録した場合は、cleanup または dealloc メソッドで CCTouchDispatcher の removeDelegate を呼び出してください。それ以外の場合、CCTouchDispatcher は、割り当てが解除された場合でも、オブジェクトに ccTouch* メッセージを送信し続けます。

于 2012-06-23T10:38:37.540 に答える