4

cocos2d に問題があります。タッチを受けるクラスを作りました。Class は のサブクラスでCCLayerあり、init次のようになります。

- (id)initWithFrame:(CGRect)frameSize
{
    self = [super init];
    if (self)
    {
        frame = frameSize;
        size = frame.size;
        origin = frame.origin;
        [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
    }
    return self;
}

そのため、すべてがシンプルに保たれています。framesizeおよびoriginクラス変数ですが、これは今のところ問題ではありません。touchDispatcherそこで、タッチを処理できるクラス witch を登録します。タッチ処理は次のように行われます。

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    return YES;
}

- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
    //Some touch logic which i need.
}

dealloc、保持しているすべての情報を公開し、 から登録を解除しtouchDispatcherます。しかし、deallocが呼び出されることはありません。に登録しないとtouchDispatcherdealloc適切に呼び出されます。重要な場合は、このクラスを別の CCLayer サブクラスに子として追加し、そのクラスでdeallocこれをリリースします。

私は何が欠けていますか?

4

2 に答える 2

3

ご自身でおっしゃいましたが、タッチ ディスパッチャーは、レイヤー オブジェクトをデリゲートとして使用したまま保持していますaddTargetedDelegateしたがって、別の場所からディスパッチャーからレイヤーを登録解除する必要があります。そうしないと、最終リリースが呼び出されなくなります (dealloc呼び出されません)。

つまり、デリゲートが同じオブジェクトである場合は、dealloc メソッドからタッチ ディスパッチャの登録を解除しないでください。

于 2012-12-24T15:22:02.077 に答える