0

A と B の 2 つのクラスがあります。A にクラス B のオブジェクトを作成します。

B *objectB = [B classInitWithParamiters:paramiters];
[self addChile:objecTB z:1 tag:varForTag];
varForTag++;

このコードを何度も呼び出します。

これは Bh ファイルです:

@interface Chicken : CCSprite <CCTargetedTouchDelegate> {
    CCsprite *spriteB;
}
+ (id) classInitWithParamiters :(int) paramiters;

これは Bm ファイルです:

+ (id) classInitWithParamiters :(int) paramiters
{
    return [[[self alloc] init] autorelease];
}
- (id) init
{
    if( (self = [super init]) ) {
        [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO];
    spriteB = [[CCSprite alloc] initWithFile:@"image.png"];
    spriteB.position = ccp(160, 240);
    [self addChild:spriteB];
    }
    return self;
}
- (void) update :(ccTime)dt
{
    NSLog(@"This is a Class B");
}
- (void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];

    if(CGrectContainsPoint([spriteB boundingbox], location))
        NSLog(@"touch moved in the class B");
}

私の問題は、AシーンをクラスCのシーンに置き換えると、クラスBのメソッド更新がログを停止しますが、画面の中央をタッチして指を動かすと、「クラスBでタッチが移動しました」とログに記録されます.
私が間違っていることは何ですか?クラス B のこれらのオブジェクトは、シーンの置き換え後に自動的に解放されるべきではありません。クラス B は CCSprite と A - CCLayer のサブクラスです。

4

2 に答える 2

2

クラス B は明らかにまだ実行中です。つまり、リークされ、cocos2d によってシャットダウンされることはありませんでした。したがって、まだタッチを受信して​​おり、スケジュールされた更新とアクションを実行している可能性さえあります.

私の推測では、保持サイクルを導入しました。典型的な原因は、子または孫のいずれでもない別のノードへの保持参照を持つノードです。たとえば、子ノードにシーン ノードを保持すると、保持サイクルが発生する可能性があります。クリーンアップ メソッドでシーン ノードが解放/nil されていない場合です (シーンがまだ保持されている場合、dealloc は呼び出されないため、クリーンアップが唯一の方法です)。そのような潜在的な保持サイクル参照をクリーンアップする場所)。

于 2012-09-14T17:54:03.067 に答える
0

あなたの問題はクラスBにあります:

+ (id) classInitWithParamiters :(int) paramiters
{
    [[[self alloc] init] autorelease];

}

オブジェクトを返す必要があります。

+ (id) classInitWithParamiters :(int) paramiters
{
    return [[[self alloc] init] autorelease];

}
于 2012-09-14T10:17:18.737 に答える