0

我有两个 A 类和 B 类。我在 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");
}

我的问题是:当我用 C 类的场景替换 A 场景时,B 类的方法更新会停止记录,但是如果我触摸屏幕中间并移动手指,它会记录“B 类中的触摸移动” .
我做错了什么?这些 B 类对象在替换场景后不应自动释放。B 类是 CCSprite 和 A - CCLayer 的子类;

4

2 回答 2

2

B类显然还在运行。这意味着它泄露了并且从未被 cocos2d 关闭。因此,它仍在接收触摸,甚至可能正在运行预定的更新和操作。

我的猜测是你引入了一个保留循环。典型原因是一个节点保留对另一个节点的引用,该节点不是其子节点或孙子节点之一。例如,将场景节点保留在子节点中会导致保留循环,如果场景节点没有在cleanup方法中释放/nil'ed(如果场景仍然保留,则不会调用dealloc,因此cleanup是唯一的清理此类潜在保留循环引用的地方)。

于 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 回答