Цепная анимация и управление памятью - PullRequest
0 голосов
/ 23 сентября 2009

Есть вопрос. У меня есть подкласс UIView, который служит моим фоном, где я прокручиваю землю. Код работает очень хорошо, и в соответствии с инструментарием, я не пропускаю, и при этом растут мои выделенные и все еще живые объекты.

Я обнаружил, что в моем приложении добавление анимации в UIImageView, который принадлежит моему подклассу UIView, похоже, увеличивает мой счет сохранения и удаляет все анимации, когда я закончил, и сбрасывает его обратно.

У меня такой вопрос: когда вы добавляете анимацию в слой с ключом, я предполагаю, что, если в этой позиции входа уже есть использованная анимация в вспомогательном словаре, она освобождается и попадает в пул автоматического выпуска?

Например:


- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
    NSString *keyValue = [theAnimation valueForKey:@"name"];
    if ( [keyValue isEqual:@"step1"] && flag ) {
        groundImageView2.layer.position = endPos;

        CABasicAnimation *position = [CABasicAnimation animationWithKeyPath:@"position"];
        position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
        position.toValue = [NSValue valueWithCGPoint:midEndPos];
        position.duration = (kGroundSpeed/3.8);
        position.fillMode = kCAFillModeForwards;
        [position setDelegate:self];
        [position setRemovedOnCompletion:NO];
        [position setValue:@"step2-1" forKey:@"name"];

        [groundImageView2.layer addAnimation:position forKey:@"positionAnimation"]; 

        groundImageView1.layer.position = startPos;
        position = [CABasicAnimation animationWithKeyPath:@"position"];
        position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
        position.toValue = [NSValue valueWithCGPoint:midStartPos];
        position.duration = (kGroundSpeed/3.8);
        position.fillMode = kCAFillModeForwards;
        [position setDelegate:self];
        [position setRemovedOnCompletion:NO];
        [position setValue:@"step2-2" forKey:@"name"];

        [groundImageView1.layer addAnimation:position forKey:@"positionAnimation"]; 
    }
    else if ( [keyValue isEqual:@"step2-2"] && flag ) {
        groundImageView1.layer.position = midStartPos;

        CABasicAnimation *position = [CABasicAnimation animationWithKeyPath:@"position"];
        position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
        position.toValue = [NSValue valueWithCGPoint:endPos];
        position.duration = 12;
        position.fillMode = kCAFillModeForwards;
        [position setDelegate:self];
        [position setRemovedOnCompletion:NO];
        [position setValue:@"step1" forKey:@"name"];

        [groundImageView1.layer addAnimation:position forKey:@"positionAnimation"]; 
    }
}

Эта цепочка анимаций бесконечно, и, как я уже сказал, она выполняет размещение созданного и живого объекта, не меняется. Я предполагаю, что каждый раз, когда я добавляю анимацию, освобождается та, которая существует в этой ключевой позиции.

Просто интересно, что я прав. Кроме того, я относительно новичок в Core Animation. Я попытался поиграть с повторным использованием анимации, но немного нетерпелив. Можно ли повторно использовать анимацию?

Спасибо! Bryan

1 Ответ

2 голосов
/ 03 октября 2009

Ваше предположение трудно проверить без исходного кода Apple. Когда вы вызываете addAnimation:forKey:, CALayer делает копию объекта анимации. От API (в документации или где-либо еще) нет гарантии, что он выпустит работающую анимацию, когда для того же ключа будет добавлена ​​другая. Для вас было бы гораздо безопаснее явно вызывать removeAnimation:forKey:, а не полагаться на то, что API делает то, что вы хотите.

Кроме того, почему вы установили removedOnCompletion на NO в коде выше? Поведение CAAnimation по умолчанию состоит в том, чтобы удалить себя из слоя после его завершения, а затем вызвать animationDidStop:finished: для делегата. Затем вы можете добавить любую другую анимацию к слою с тем же ключом. Разве это не то, что вы пытаетесь сделать? Похоже, что вы, возможно, слишком обдумали это.

Что касается вашего вопроса о повторном использовании анимаций: поскольку объект анимации копируется при добавлении в CALayer, вы можете хранить ссылку на созданный вами объект анимации и продолжать добавлять его на столько слоев, сколько вам нужно, на любое количество раз, как вам нравится.

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