iOS: почему этот экземпляр освобожден? - PullRequest
1 голос
/ 03 января 2012

код:

if(!spriteInfoBack){
        spriteInfoBack = [CCSprite spriteWithFile:@"bg_player.png"];
        [spriteInfoBack setAnchorPoint:CGPointMake(0, 1)];
        [spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)];
        [parent addChild:spriteInfoBack];
}else{
        [spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)];
}

Вывод сбоя:

[CCSprite setPosition:]: message sent to deallocated instance 0xc59cc70

и он расположен в этой строке:

[spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)];

Я думаюстранно, потому что if (! spriteInfoBack) уже проверил, что экземпляр освобожден или нет.

Ответы [ 3 ]

1 голос
/ 03 января 2012

Вам необходимо сохранить CCSprite. Метод класса spriteWithFile возвращает автоматически освобожденный объект. Возвращаемое значение, хранящееся в spriteInfoBack, не принадлежит вам. Это означает, что время жизни объекта до истечения следующего пула автоматического выпуска. Из вашего кода видно, что вы используете spriteInfoBack как что-то, что лениво инициализируется, а затем используется позже. Что вы хотите сделать, это сохранить возвращаемое значение spriteWithFile примерно так:

spriteInfoBack = [[CCSprite spriteWithFile:@"bg_player.png"] retain];

И в будущем вам нужно будет выпустить spriteInfoBack. Я не вижу остальную часть класса, но если spriteInfoBack является переменной экземпляра класса, то это имеет смысл в dealloc.

0 голосов
/ 03 января 2012

Экземпляр находится в пуле автоматического выпуска, который сливается между итерациями цикла событий пользовательского интерфейса.Если вы хотите, чтобы объект пережил пул автоматического выпуска, вы должны явно сохранить / освободить объекты самостоятельно.Даже если объект был освобожден (поскольку вы его не сохранили), указатель spriteInfoBack все еще запоминает старый адрес объекта.

0 голосов
/ 03 января 2012

Нет, !spriteInfoBack просто сравните значение с nil (т.е.: spriteInfoBlack == nil), которое отличается (если вам нужно убедить себя, запишите что-нибудь в часть else). Переменная по-прежнему содержит адрес памяти и, следовательно, сбой, потому что экземпляр был освобожден.

Мы не можем понять, глядя на код, почему экземпляр освобожден, поэтому дважды проверьте код, управление памятью и / или поместите nil в переменную, если она вам больше не нужна, таким образом, вы убедитесь, что тест не провалится.

...