2010-08-10 3 views
0

나는 또 다른 질문을 올렸다. 이것은 ppl이 더 좋을 것이라고 말한 것처럼 오래된 코드입니다. 그러나 할당 된 메모리를 해제하는 해결책을 찾지 못했습니다.아이폰 UIImage 배열 메모리 누수 (예전)

imageArray_danceright = [[NSArray alloc] initWithObjects: 
[UIImage imageNamed:@"FrankieDanceRetime_0001.jpg"], 
.. 40 images 
[UIImage imageNamed:@"FrankieDanceRetime_00040.jpg"],nil]; 


imageArray_danceleft = [[NSArray alloc] initWithObjects: 
[UIImage imageNamed:@"FrankieDanceRetime_0041.jpg"], 
.. 40 images 
[UIImage imageNamed:@"FrankieDanceRetime_00080.jpg"],nil]; 

imageArray_stand= [[NSArray alloc] initWithObjects: 
[UIImage imageNamed:@"FrankieSingtRetime_0001.jpg"], 
[UIImage imageNamed:@"FrankieSingtRetime_0002.jpg"], 
[UIImage imageNamed:@"FrankieSingtRetime_0003.jpg"],nil]; 

//start animation 
myimageview.animationImages = imageArray_stand; 
myimageview.animationDuration = 0.23; 
myimageview.contentMode = UIViewContentModeBottomLeft; 
myimageview.animationRepeatCount = 0.0; 
myimageview.image = [myimageview.animationImages objectAtIndex:1]; 
[myimageview startAnimating]; 


- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    touch = [[event allTouches] anyObject]; 
    if ([touch view] == overlay_fuesserechts) { 
    [myimageview setAnimationImages:imageArray_danceright]; 
     myimageview.animationDuration = 2.0; 
     myimageview.contentMode = UIViewContentModeBottomLeft; 
     myimageview.animationRepeatCount = 1; 
     [myimageview startAnimating]; 
    } 
    if ([touch view] == overlay_fuesselinks) { 
    [myimageview setAnimationImages:imageArray_danceleft]; 
     myimageview.animationDuration = 2.0; 
     myimageview.contentMode = UIViewContentModeBottomLeft; 
     myimageview.animationRepeatCount = 1; 
    [myimageview startAnimating]; 
    } 

잘 작동합니다. 기기/할당을 보면 메모리를 해제하지 않습니다. '스탠드'애니메이 션의 경우 8MB로 시작하고 fuesserechts의 경우 32MB까지 올라갑니다. 그리고 fuesselinks를 클릭하면 최대 55MB가됩니다. (나는 6 개의 애니메니티가 있습니다. 그래서 몇 가지 더 이상 충돌이 있습니다) [myimageview setAnimationImages : nil]; (touchesBegan에서) 각 setAnimationImages에 대한 ... 나는 여전히 메모리를 해제하지 않습니다. 모든 Allocatoins 전체 바이트는 여전히 증가합니다. 내가 [myimageview.animationImages release]를 설정하면; 각 setAnimationImages에 대해 (touchesbegan) ... 몇 번의 터치 후에도 충돌이 발생합니다. 당신이 가능하게 세 가지 배열을 클릭 할 때마다 초기화하고 있지만, 배열은 단지 메모리에 스택 있도록 그들을 석방 결코처럼

감사 크리스이 코드에서

+0

3 개의 배열을 해제 할 코드가 없습니다. 한 번 또는 여러 번만 만드십니까? – Vladimir

답변

1

이제는 원래 코드를 보았습니다. 조언이 어디에서 왔는지 알 것 같습니다. imageNamed: 대신 (이전 질문에서와 같이) imageWithContentsOfFile:을 사용하는 것이 좋습니다. 전자는 이미지를 캐시하지만 후자는 이미지를 캐시하지 않습니다. 나는 이것이 여기 당신의 문제라고 확신하지 않습니다.

덜 명확한 점은이 코드가 더 큰 시스템에 적합하다는 것입니다. 나는 코드의 첫 번째 스트레치를 추정한다 (모든 imageNamed: 호출) init 메소드에 있는가? 그럴까요?

//start animation 섹션은 실제로 동일한 방법 또는 다른 곳에 있습니다. 이것은 귀하의 touchesBegan: 메소드를 전체적으로 포함하기 때문에 명확하지 않습니다.

myimageview이 생성되는 곳과 소유자가 표시되지 않습니다. 동일한 클래스에서 작성하는 경우 dealloc에 릴리스해야합니다. dealloc에 대해 말하면이 버전에서 누락 된 것으로 보입니다 - 새 버전에서만 해당되는 것입니까? 당신은 그것을 여기에서 필요로한다 (그 이상).

코드 조각을 명확하게 게시하는 것이 어렵다는 것을 알고 있습니다. 그러나이 경우 명확해야 할 사항입니다.

설정 코드 (imageNamed: 스트레치)가 매번 호출 될 때마다 - 설명 할 때마다 myimageview이 누락 될 수 있습니다.

+0

덕분에 나는 그것으로 볼 것입니다 :) –

+0

나는 ImageAnimation 사용을 중단했습니다. 나는 몇 시간을 보냈지만 여전히 성공을 거두지 못했습니다. 이제 각 0.3 초 ​​루프를 호출하는 타이머를 사용하여 플라이에서 이미지를 할당하고 해제합니다. 흐름 및 아무런 메모리 누출없이 작동합니다. 그냥 거기에서 사용하는 것이 궁금합니다 [myimageview.image release] ; myimageview.image = nil; \t \t \t [imageArray_spagat objectAtIndex : piccounter-1]]; myimageview.image = nil로 설정하면 안됩니다. 그것은 또한 잠시 후에 충돌합니다. 그러나 왜. 아무튼 나중에 하나의 명령 만 할당 할 수 있을까요 ?? –

1

, 그것은 보인다. 또는 배열을 실제로 유지하지 않을 수도 있습니다. 배열 초기화 위치에 제공된 코드는 나머지 클래스에 컨텍스트가 없기 때문에 말할 수 없습니다.

이미지 배열을 클래스의 속성으로 유지하여 한 번만 초기화하도록해야합니다. self. 표기법을 사용하여 표기법을 올바르게 사용하려면 표기법을 그대로 사용하십시오. Class '할당 해제 메소드에서만 해제하십시오.

다른 개체의 속성에는 절대로 보내지 마십시오. 각 객체는 독점적으로 자체 메모리 사용을 관리해야합니다. 이 경우 UIImageView의 animationImages 속성 릴리스를 보내는 것은 큰 오류입니다. 거의 항상 충돌을 일으킬 것입니다.

많은 수의 imageNamed 콜을 사용하여 배열을 초기화하는 것은 위험합니다. 특정 이미지에 문제가 발생하면 오류를 추적하는 데 어려움을 겪습니다. 대신, 가변 배열을 사용하고 for 루프를 사용하여 배열을 빌드하십시오. 이렇게하면 코드가 더 작아지고 오류가 명확 해집니다.

+0

고마워 ... 내가 볼 것입니다 .. 또한 내가 dealloc 수있었습니다 ..하지만 그 이상한 .. 시뮬레이터에서,하지만 dealloc 장치에서 않습니다. 그러나 각 애니메이션을 릴리스 할 때 다시 애니메이션을 다시로드해야하므로 느려지 게됩니다. 이제 다른 솔루션을 찾고 더 큰 그룹의 이미지에 대해 가능한 "setAnimation"을 피할 것입니다. 감사합니다 –