2013-09-26 5 views
4

I가 다음 문제 : I (16 개)의 사각형 그리드 (각 I가 상속 생성 된 클래스를 표시하는 기본 뷰 객체 (즉 UIView의 상속)가불량 메모리 관리 성능

UIImageView에서), 4x4 레이아웃.

16 개의 정사각형 각각은 160x160이며 30kb보다 크지 않은 이미지 (각 사각형마다 다른 이미지)를 포함합니다. 그러나 이미지는 전체 크기로 프로그램의 다른 위치에서 사용되기 때문에 500x500이므로 setFrame 메서드를 사용하여 "square"클래스의 크기를 160x160으로 조정합니다.

  1. 이 사각형의 각 기본 뷰 객체에 추가 할 때, 메모리 사용량을 증가 : 응용 프로그램이 실행되는 엑스 코드의 메모리 관리 기능을보고

    , 나는 몇 가지를 발견했습니다 앱의 1MB 씩 인스턴스화시에는 발생하지 않지만 기본 뷰 객체에서 [self addSubview : square]를 사용하여 추가 할 때만 가능합니다.

  2. 모든 사각형에 대해 동일한 이미지를 사용하면 메모리 증가량은 최소한 입니다. 이미지없이 정사각형 객체를 초기화하면 기본적으로 0이됩니다.
  3. 동일한 앱이 시뮬레이터에서 실행될 때 실제 장치에서 수행하는 메모리의 1/6을 사용합니다 ( ).

전체적인 요점은 다음과 같습니다. 왜 30kb 이미지를로드 할 때 각 사각형이 1MB의 메모리를 사용합니까? 이것을 줄이는 방법이 있습니까? 나는 많은 다른 방법으로 이미지를 만들려고 시도했다 : [UIImage imageNamed:img], [UIImage imageWithContentsFromFile:path], [UIImage imageWithData:imgData scale:scale] 그리고 프레임의 크기를 조정하지 않았다.

답변

5

더 작은 UIImageView에서 500x500 이미지를 사용하면 더 큰 이미지가 메모리에로드됩니다. 이 문제는 UIImage의 크기를 조정하여 (의 frame 만 조정하는 것이 아니라) 160x160 이미지를 만들고보기에서 해당 이미지를 사용하여 해결할 수 있습니다. 다음과 같이 호출 할 수있는 이미지를 크기를 조정하는 몇 가지 코드를 this answer를 참조하십시오

UIImage *smallImage = [image scaleImageToSizeAspectFill:CGSizeMake(160, 160)]; 

당신도, 크기가 조정 된 이미지를 저장 할 수 있습니다 당신은 끊임없이 창조의 계산 오버 헤드와 함께 자신을 계루하지 않을 수 있도록 작은 이미지마다, 예를 들면 :

NSData *data = UIImagePNGRepresentation(smallImage); 
[data writeToFile:path atomically:YES]; 

그런 다음 뷰의 미래를 호출에 작은 이미지에 해당하는 PNG 파일을로드 할 수 있습니다. 이미지가 아마 영구 저장소에 압축 된 JPG 또는 PNG로 저장하는 동안, 나는 그것이 비 압축 비트 맵으로 열리는 메모리에 의심 때문에 너무 많은 메모리를 차지 왜 귀하의 질문에 대한 대답에서


, 그것은이다. 많은 내부 형식이 있지만 일반적인 것은 빨강, 초록, 파랑 ​​및 알파 각각 8 비트의 32 비트 형식입니다. 세부 사항에 관계없이 픽셀 당 4 바이트를 사용하여 500 x 500 픽셀 표현이 1 메가 바이트 메모리로 변환 될 수있는 방법을 빠르게 확인할 수 있습니다. 그러나 160x160 크기의 이미지는 대략 크기의 1/10 크기 여야합니다.

+0

빠른 답변과 제안에 감사드립니다.결국 범인은 UIImageView를 init'ing하고 크기를 조정한다고 알았습니다. UIImageView를 인스턴스화하기 전에 UITextBeginImageContext를 사용하여 현재 컨텍스트에서 새 이미지를 설정하기 전에 몇 줄의 코드를 동적으로 크기를 조정하고 있습니다. UIGraphicsEndImageContext입니다. 이는 그 자체로 1MB/이미지에서 150k/이미지로 다소 축소되었습니다. 나는 비록 메모리 사용량을 더 낮출 수 있는지 알아보기 위해 노력하고 있습니다. 다시 한번 감사드립니다. – user2491253

+0

그건 정확히 제가 제안한 것입니다, 즉 크기 이미지가 먼저입니다. 네가 알아 낸 것 같은데. 잘 했어!!! – Rob