Cocos2d-iPhone:在dealloc之后调用“update”

时间:2011-03-13 04:47:36

标签: iphone ios cocos2d-iphone

所以我有一个CCSprite对象的子类,在其init方法中,我调用:

[self scheduleUpdate]

我稍后会从其父CCNode中释放此对象,如下所示:

[self removeChild:sprite cleanup:YES];

另外,我在sprite的dealloc方法中调用[self unscheduleUpdate]。

然而,我得到了一个糟糕的内存访问,所以看起来在对象发布后仍然尝试更新方法(我把它缩小到这个,因为如果我注释掉[self]它会很好地工作scheduleUpdate] line。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

发现这篇文章试图提出同样的问题。我尝试了unchedule update(在我的init方法中)没有运气,但后来意识到通过移动[self unscheduleUpdate];基于它工作的条件实际更新方法(连续运行,与init方法不同)!

因此,对于那些寻找复制粘贴的人来说,这是我从http://www.ccsprite.com/cocos2d/using-ccprogresstimer-cocos2d-example.html#HCB_comment_box实现的进度条示例

 -(id) init
    {
    //initialize progress bar, make sure to add a file named green_health_bar.png to your
    //resource folder
        timer = [CCProgressTimer progressWithFile:@"green_health_bar.png"];

        //set the progress bar type to horizontal from left to right
        timer.type = kCCProgressTimerTypeHorizontalBarRL;

        //initialize the progress bar to zero
        timer.percentage = 0;

        //add the CCProgressTimer to our layer and set its position
        [self addChild:timer z:1 tag:20];
        [timer setPosition:ccp(100, 280)];
        [self scheduleUpdate];
    }

并在您的更新方法中:

-(void)update:(ccTime)dt

{

    //get progress bar
    CCNode* node = [self getChildByTag:20];

    timer.percentage += dt * 10;
    if (timer.percentage >= 100)
    {
        [self gameOver]; //used to stop parallax and show gameover menu
        [self unscheduleUpdate];
    }
}

我通常不允许论坛回复电子邮件,但可以随意通过@ russ152提问!

答案 1 :(得分:0)

嗯..尽量不要使用scheduleUpdate?我试过寻找self unscheduleUpdate但是在CCNode中没有这样的功能..你可以尝试[self unscheduleAllselectors],它会停止对象的所有选择器,包括更新选择器,如果你不再使用该对象..或者使用自定义选择器..