2009-06-08 4 views
3

저는 한 번에 약 44kb의 JPEG를 메모리에 보관해야하는 응용 프로그램을 작성하고 있습니다. 응용 프로그램이 메모리 부족 경고를 발생시키기 전에 약 22 메가 바이트를 사용할 수 있다고 들었으므로이 작업을 수행 할 수 있어야합니다. 그러나, 일단 나는이 메시지가 콘솔에 진열 시작로드 메가 바이트 주위에 통과 : 그런 다음 다시 홈 화면으로 나를 덤프메가 바이트 이상의 이미지를로드하면 왜 내 iPhone의 메모리가 모두 소모됩니까?

 
Mon Jun 8 16:37:19 unknown configd[21] : kernel memory event (90), free: 374, active: 1736, inactive: 959, purgeable: 0, wired: 6260 
Mon Jun 8 16:37:20 unknown configd[21] : kernel memory event (95), free: 363, active: 876, inactive: 492, purgeable: 0, wired: 6241 
Mon Jun 8 16:37:20 unknown SpringBoard[22] : Memory level is critical (5%). No apps to kill. Will kill SpringBoard 
Mon Jun 8 16:37:24 unknown SpringBoard[22] : Jetsaming SpringBoard... 

.

#define NUM_IMAGES 40 

@interface MyClass : NSObject { 
    UIImageView* imageView; 
    UIImage* loadedImages[NUM_IMAGES]; 
} 

- (void)initImages; 

@property (nonatomic, retain) IBOutlet UIImageView* imageView; 

@end 


@implementation MyClass 

@synthesize imageView; 

- (void)initImages { 
    int i; 
    for (i = 0; i < NUM_IMAGES; i++) { 
     loadedImages[i] = [UIImage imageNamed:[NSString stringWithFormat:IMAGE_FORMAT, i+1]]; 
    } 
    imageView.image = loadedImages[0]; 
} 

@end 

뭔가 거기에 내가 잘못 여기서 뭐 해요 :

저는 여기에 이미지를로드하는 데 사용하고 코드인가? iPhone 응용 프로그램은 실제로 1 메가 바이트의 메모리 만 사용할 수 있습니까?

답변

15

JPEG 이미지와 같은 압축 된 이미지를로드하면 일반적으로 압축되지 않습니다 (이미지를 표시하거나 조작하는 것과 같은 유용한 작업을 수행하기 위해 수행해야하는 작업이기 때문에).

압축 해제 된 이미지가 확실히 JPEG 형식의 압축 화상 (너비와 높이를 곱한 대략 3 또는 4 바이트)를 차지하는 44 킬로바이트보다 큰 것이다. 따라서 JPEG 크기 만 보더라도 생각보다 빨리 메모리가 부족합니다.

실제로 메모리에 JPEG 만 보유하면 (메모리와 함께 아무것도 사용하지 않고 그냥 잡고있는 경우) 원시 바이트 스트림을 메모리에 저장 한 다음 필요할 때만 이미지로 로딩하는 것을 고려할 수 있습니다 .

하지만 필요한 조치에 따라 다른 대안이있을 수 있습니다. 한 번에 모든 이미지를 메모리에 정말로 필요합니까? 메모리를 절약하기 위해 필요할 때까지 단일 이미지로드를 지연하고 그 시간에 다른 이미지를 언로드 할 수 있습니까? 캐시 될 수있는 각 이미지에서 특정 정보 만 필요합니까? (이후에는 이미지 자체가 필요하지 않습니다)? ...

+0

감사합니다, 그것은 도왔다. 이미지를 변경하거나로드하는 동안 메모리에 전체 해상도 이미지의 JPEG 데이터를 저장하고 1/4 해상도 이미지를 표시하도록했습니다. 감사합니다. –

1

imageNamed:은 압축되지 않은 데이터를 이미지 데이터를 압축합니다. imageWithContentsOfFile:을 사용하면 괜찮을 것입니다. 그 방법은 압축 된 데이터 만 저장하고 그릴 때 즉시 디코딩하기 때문입니다.

당신이 할 수 있어야는 대한 대답은 SO 특히 Dispelling the UIImage imageNamed: FUD

질문 참조 : 설명에 대한

[UIImage imageWithContentsOfFile:[[UIBundle mainBundle] pathForResource:@"filename" ofType:@"jpeg"]];