2009-09-22 12 views
0

질문을 얻었다. 내가 바닥을 스크롤 오전 내 배경으로 역할을하는 하위 클래스의 UIView가 있습니다. 이 코드는 Instrumentation에 따라 정말 멋지게 작동하고 있습니다. 나는 새어 나지 않고 살아있는 Object 할당이 성장하고 있지 않습니다.체인화 애니메이션과 메모리 관리

내 응용 프로그램에서 하위 클래 싱 된 UIView에서 소유 한 UIImageView에 애니메이션을 추가하면 보유 개수가 늘어나고 모든 애니메이션이 제거 될 때 다시 제거되는 것으로 나타났습니다.

내 질문은 키가있는 레이어에 애니메이션을 추가 할 때 공개 애니메이션 사전에 해당 애니메이션이 이미있는 경우 해당 애니메이션이 릴리스되어 자동 출시 풀로 이동한다고 가정합니다. ? 예를 들어

: 나는 실행을했다


- (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을 처음 접하게되었습니다. 나는 애니메이션을 재사용하면서 놀려고했지만 조금 참을성이 없었다. 애니메이션을 재사용 할 수 있습니까?

감사합니다. 브라이언

답변

2

당신의 가정은 애플의 소스 코드없이 확인하기가 어렵습니다. addAnimation:forKey:으로 전화하면 CALayer은 애니메이션 개체의 사본을 만듭니다. 동일한 키에 대해 다른 애니메이션이 추가 될 때 실행중인 애니메이션을 릴리스한다는 API (문서 또는 다른 곳)에서 보장 할 수 없습니다. API를 사용하여 원하는 것을 수행하는 대신 명시 적으로 removeAnimation:forKey:에 전화하는 것이 훨씬 안전합니다. 또한

, 왜 위의 코드에서 NOremovedOnCompletion을 설정할 수 있나요? CAAnimation의 기본 동작은 완료된 후에 자신을 레이어에서 제거한 다음 위임자에게 animationDidStop:finished:을 호출하는 것입니다. 그런 다음 동일한 키가있는 레이어에 다른 애니메이션을 추가 할 수 있습니다. 이게 정확히 네가하려는 일이 아닌가? 네가 조금 생각하는 것 같아.

애니메이션 재사용에 대한 질문 : 애니메이션 오브젝트가 CALayer에 추가 될 때 복사되기 때문에 생성 한 애니메이션 오브젝트에 대한 참조를 보유하고 원하는만큼 많은 레이어에 계속 추가 할 수 있습니다 당신이 원하는대로. removedOnCompletion``관련하여

+0

는 유래에 다른 답변은 NO'와''kCAFillModeForwards'에 fillMode''이 설정을하지 않는 한, 애니메이션의 결과가 지속되지 않을 것이라는 점을 나타냅니다. 즉, 속성 변경은 'CALayer'에서 'CAAnimation'을 제거하면 제거됩니다. 애플은 분명히 속성 애니메이션을 비파괴적인 것으로 만들고 싶었다. 'animationDidStop : finished' 메소드를 사용하여 속성을 최종 상태로 설정할 수 있지만, CALayer가 사전 애니메이션 상태로 되돌아가는 그래픽 "blip"으로 끝나는 경우가 많습니다. 그것은 두려운 것처럼 보입니다. –

+0

그게 대부분 맞지만 간단한 방법이 있습니다. 애니메이션은 레이어 자체에 적용되지 않습니다. 오히려'presentationLayer' 라 불리는 사본이 생성되고, 애니메이션이 그것에 적용됩니다. 또한, 메인 runloop의 모든 반복은 암시 적'CATransaction'으로 래핑되기 때문에 애니메이션을 추가하기 전에 레이어의 최종 속성을 설정할 수 있습니다. 애니메이션을 포함한 모든 변경 사항이 한 번에 제출되며 시작 또는 끝 부분에는 아무런 블립도 표시되지 않습니다. 예를 들면 다음과 같습니다.'myLayer.position = CGPointMake (100, 100); [myLayer addAnimation : anim forKey : @ "위치"]; –