更换场景后释放所有对象

时间:2012-09-14 09:38:33

标签: iphone objective-c ios4 cocos2d-iphone

我有两个A和B类。我在A:

中创建了B类的对象
B *objectB = [B classInitWithParamiters:paramiters];
[self addChile:objecTB z:1 tag:varForTag];
varForTag++;

我多次调用此代码。

这是B.h文件:

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

这是B.m文件:

+ (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的子类;

2 个答案:

答案 0 :(得分:2)

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

我的猜测是你引入了retain cycle。典型的原因是节点具有对不是其子节点或孙子节点的不同节点的保留引用。例如,如果场景节点未在清理方法中释放/零,则保留场节点在子节点中会导致保留周期(如果场景仍然保留则不会调用dealloc,因此清理是唯一清理这种潜在保留周期参考的地方)。

答案 1 :(得分:0)

您的问题出在B组:

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

}

您必须返回对象。

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

}