Cocos2d-iPhone: «обновление» вызвано после dealloc - PullRequest
0 голосов
/ 13 марта 2011

Итак, у меня есть подкласс объекта CCSprite, и в его методе init я вызываю:

[self scheduleUpdate]

Позже я освобождаю этот объект от его родительского CCNode следующим образом:

[self removeChild:sprite cleanup:YES];

Кроме того, я вызываю [self unscheduleUpdate] в методе dealloc спрайта.

Однако я получаю плохой доступ к памяти, поэтому кажется, что метод обновления все еще предпринимается после того, как объект был освобожден (Я сузил его до этого, так как он отлично работает, если я закомментирую строку [self scheduleUpdate].

Есть идеи?

Ответы [ 2 ]

1 голос
/ 04 июня 2012

Нашел этот пост в попытке задать тот же вопрос. Я попытался выполнить незапланированное обновление (также в рамках моего метода 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!

0 голосов
/ 13 марта 2011

Хм .. попробуйте не использовать scheduleUpdate? Я пытался найти self unscheduleUpdate, но в CCNode такой функции нет. Вы можете попробовать [self unscheduleAllselectors], который останавливает все селекторы объекта, включая селектор обновления, если вы больше не используете объект .. Или используйте пользовательские селекторы вместо ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...