2014-07-23 2 views
0

배경이 무작위로 변경되는보기를 만들었습니다. 총 10 개의 이미지를 표시하는데 사용하고 있습니다.메모리를 효율적으로 관리하는 방법

다음은 배경 이미지 코드입니다.

- (void)viewWillAppear:(BOOL)animated 
{ 
    myTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changeImage) userInfo:nil repeats:YES]; 
} 

-(void)changeImage 
    { 
     self.imgView.image=nil; 
     int randNum = rand() % (9 - 1) + 1;. 
     NSString *num = [NSString stringWithFormat:@"%d", randNum]; 
     self.imgView.image=[UIImage imageNamed:[NSString stringWithFormat:@"%@.png",num]]; 
    } 

코드가 정상적으로 작동합니다.

내 질문은 34 메가 바이트 이상의 메모리 사용량을 보여 주며 다른 뷰를 푸시해도 여전히 34 메가 바이트를 초과합니다. 변수를 만들면 nil;

enter image description here

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [myTimer invalidate]; 
     self.imgView.image=nil; 
     myTimer = Nil; 
} 

어떻게 여기에 메모리 사용량을 관리 할 수 ​​있습니까? 또한

+3

imageNamed : 이미지를 캐시합니다. 이것이 귀하의 문제의 원인 일 수 있습니다. 자세한 내용은 http://stackoverflow.com/questions/924740/dispelling-the-uiimage-imagenamed-fud를 참조하십시오. – CW0007007

+1

당신은 또한'viewWillAppear'과'viewWillDisappear'에 대한 슈퍼 구현을 원합니다. –

답변

1

당신은 전무로 설정하여 타이머를 무효화 할 필요가 발사되는 것을 방지하지 않습니다

일단 실행 루프 예정 타이머 지정된 간격으로 무효화 될 때까지 작동합니다. 반복하지 않는 타이머는 발생 후 즉시 무효화됩니다. 그러나 반복 타이머의 경우 invalidate 메서드를 호출하여 타이머 개체를 직접 무효화해야합니다. 이 메서드를 호출하면 현재 실행 루프에서 타이머를 제거하도록 요청합니다. 결과적으로 타이머가 설치된 동일한 스레드에서 항상 invalidate 메서드를 호출해야합니다. 타이머를 무효로하면 실행 루프에 더 이상 영향을 미치지 않도록 타이머가 즉시 비활성화됩니다. 그런 다음 run 루프는 invalidate 메서드가 반환되기 바로 전에 또는 나중에 어떤 시점에서 타이머 (및 타이머에 대한 강력한 참조)을 제거합니다. 일단 무효화되면, 타이머 오브젝트는 재사용 될 수 없습니다.

그래서 당신은 실행을 중지하려면
[myTimer invalidate]; 
myTimer = nil; 

이 필요합니다.

메모리 사용 측면에서; 너는 무엇을 기대하고 있니? 네비게이션 스택에 새로운 뷰를 방금 밀어 넣었다면 이전 뷰는 여전히 주변에 있고 그 내용은 메모리에있을 것입니다. 응용 프로그램이 메모리 부족 상태가 될 때까지는 레이어 캐시가 제거되지 않으며, 34MB는이 오류를 일으키지 않을 것입니다.

메모에서 지적했듯이 imageNamed는 메모리 압력을받을 때까지 메모리에 이미지를 캐싱하고 UIKit이 제대로 처리하는지 확인하기 위해 viewXX의 super 구현을 호출해야합니다.

메모리 경고를 시뮬레이트하고 어떤 현상이 나타나는지보십시오. 걱정할 사항이 없다고 생각합니다. 이제 타이머를 무효로합니다.

+0

이러한 변경도 수행 했으므로 업데이트 된 질문 – Shekhu

+0

을 확인하십시오. 이미지가없는보기를로드하는 경우 3 ~ 5MB 만 표시되지만 이미지는 10x 메모리 사용량을 표시합니다. 이'self.imgView.image = nil;'을하는 것은 image.i가 없으면 레벨을 5 배로 줄이지 만 메모리를 줄이는 것 같지 않습니다. 나는 3 ~ 5 퍼센트의 값을 얻기 위해 어떤 방법 으로든 arround를 기대하고 있습니다. 모든 프로젝트, 나는 이것에있어 초보자이며 탐구 중이다. – Shekhu

+0

보기가 메모리에서 완전히 제거되고 캐시가 지워지지 않는 한 메모리를 완전히 다시 얻지는 못한다. 너는 아무것도 걱정하지 않아. 나는 당신이 "3 ~ 5 %"라는 의미를 이해하지 못합니다. – jrturton

0

viewdiddisappear을 추가하려고

self.imgView=nil; 
+0

ARC를 사용하고 있습니다. – Shekhu

+0

이 코드를 사용해 보셨습니까? – NKB

+0

예, 업데이트 된 질문 – Shekhu

0

imageNamed: 메서드는 메모리 압력 상황에서 이미지를 제거하고 imageWithContentsOfFile:을 사용하고 이미지 뷰의 이미지 속성을 nil로 설정하려고 할 때 강제로 이미지를 캐시합니다.

관련 문제