2011-06-13 2 views
0

일련의 이미지에서 팬하는 제스처가 있습니다. 특정 시간 동안 패닝 한 후에이 메모리를 올바르게 관리하는 방법이 확실하지 않아 충돌이 발생합니다.이미지로드시 메모리 관리

animImage는 UIImageView입니다. 여기

그것이 작동하는 방법이다 :

- (IBAction) panAnim:(UIPanGestureRecognizer *)sender{ 
    CGPoint translate = [sender translationInView:sliderView]; 

    if (translate.x >= lastPoint) { 
     difference = translate.x - lastPoint; 
     [self forwardAnim:difference]; 
    } else { 
     difference = lastPoint - translate.x; 
     [self backwardAnim:difference]; 
    } 
    lastPoint = translate.x; 
} 

-(void)forwardAnim:(CGFloat)speed{ 
    NSInteger newFrame = currentFrame+speed; 
    currentFrame = newFrame; 
    if (currentFrame>=totalFrames) { 
     currentFrame=0; 
    } 
    NSString *newImagePath = [NSString stringWithFormat:@"%@", [currentAnimation objectAtIndex:currentFrame]]; 
    animImage.image = [UIImage imageNamed:newImagePath]; 
} 

-(void)backwardAnim:(CGFloat)speed{ 
    NSInteger newFrame = currentFrame-speed; 
    currentFrame = newFrame; 
    if (currentFrame<0) { 
     currentFrame=(totalFrames-1); 
    } 
    NSString *newImagePath = [NSString stringWithFormat:@"%@", [currentAnimation objectAtIndex:currentFrame]]; 
    animImage.image = [UIImage imageNamed:newImagePath]; 
} 

애니메이션은 번역의 위치를 ​​감지하고 무엇을 '프레임'애니메이션에 있어야 계산 한 다음 이미지를 바꿉니다.

나는 매우 부드러운 애니메이션을 얻고 있지만 분명히 메모리를 올바르게 관리하지 않기 때문에 충돌이 발생합니다. 메모리 경고가 발생하고 충돌이 발생하지만 이미지를 한동안 스크롤했을 때만 오류가 발생합니다.

한 번에 100 개의 이미지를 미리로드하는 방법을 알아야하므로 100 개의 이미지 만 저장할 수 있습니다. 인스트루먼트의 IO 출력에서 ​​이미지가 제대로 열리고 닫히기 때문에 이상합니다.

도움 주셔서 감사합니다.

건배, D

+1

animImage는 UIImageView입니까? 언뜻보기에 currentAnimation의 색인 문제 이외의 다른 코드를 보지 못했습니다. 스택 트레이스를 얻었습니까? – csano

+0

예 animImage는 UIImageView입니다. 이 코드가 괜찮 으면 충돌의 원인이 다른 곳에서 발생했을 수 있습니다. 조사 할게. 건배 –

+0

@ j0k 문제의 원인이 메모리 부족 경고이며 충돌합니다. 애니메이션 때문입니다. –

답변

1

+[UIImageView imageNamed:] 캐시 이미지가로드, 그래서 당신의 메모리 사용량이 계속 증가한다는 놀라운 일이 아니다. 대신 해당 전화를 +imageWithContentsOfFile: (으)로 변경해보십시오. 이로 인해 애니메이션 성능이 저하 될 수 있지만, 메모리 사용량이 현저히 떨어지는 것으로 보입니다.

메모리 경고는 충돌이 임박했다는 것을 의미하지 않습니다. 당신이 충돌의 세부 사항을 게시한다면 도움이 될 것입니다. 충돌 로그를 보면 코드에서 충돌로 이어지는 줄을 식별 할 수 있어야합니다. 스택 위쪽의 몇 프레임 일 수 있습니다. 그 라인을 찾고, 그 앞에 하나 또는 두 개의 중단 점을 놓고, 문제를 야기 할 수있는 각 라인에서 일어날 수있는 일을 상상해보십시오 - 할당 실패, 값이 나쁜 것 등 -

현재, 25kB 이미지 파일이 메모리에서 훨씬 더 큰 크기로 확장 될 가능성이 있습니다.

+0

이 작동합니다. 내가 이것을 사용했기 때문에 나는 추락하지 않았다. 나는'imageNamed : 캐싱에 대해 몰랐다.'- 고마워요! 현상금을받을 때 현상금을 수여합니다 (21 시간) –

+0

도움을 주어 기쁩니다. 그래도 낮은 메모리 조건에서 철저히 테스트해야합니다. 메모리가 부족해 지더라도 응용 프로그램이 중단되지 않아야합니다. '+ imageWithContentsOfFile :'로 전환하는 것이 유익한 변화 일 수 있지만 메모리 부족 상황을 제거하여 실제 문제를 숨길 수도 있습니다. – Caleb

+0

이것은 앱의 유일한 기능입니다 (아직 많이 만들었습니다). 그래서 문제가 가려져 있는지 확신 할 수 없습니다.이 순간이 유일한 문제라고 생각합니다. 이제이 문제는 수정되었습니다. 나머지 부분은 계속 진행할 수 있습니다. –