2013-04-17 2 views
1

UIImages 배열을 사용하여 화면에 많은 수의 이미지를 표시하려고합니다. 현재 각 이미지를 NSMutableArray에 추가 한 다음 필요할 때 액세스합니다. 그러나 이미지 수가 증가하면 결국 앱이 다운됩니다.UIImage의 큰 NSArray를 사용할 때 메모리 문제가 발생했습니다.

메모리 할당을 알아 내기 위해 Instruments를 사용해 보았습니다. 메모리가 약 20MB에 도달하면 응용 프로그램이 충돌하는 것 같습니다. 이 문제를 해결할 방법이 있습니까? 아니면이 일을 할 때 최대한 메모리를 절약 할 수있는 방법이 있습니까? 당신이 이것에 대한 답을 갖고 있지 않더라도 비슷한 문제를 경험 한 사람이 있습니까? 그렇다면 어떻게 타협 했습니까/해결 했습니까?

그런데 앱에서 이미지를 빠르게 사용해야하기 때문에 파일 (또는 핵심 데이터)에 저장하고 가져 오는 것을 생각하지 않았으며 핵심 데이터 또는 iOS의 파일이 메모리를 사용할 때보 다 느리다. (내가 틀렸다면 정정 해주세요.)

+0

는 보통 방법으로 프로그램이 주위에 메모리가 부족 얻을 것은 디스크에 페이지 그것입니다 (하지만이 저하 될 수 있습니다 아래로 프로그램). 그 외에 컴파일 설정이나 프로그램 설정을 변경해야합니다. – tay10r

+0

지적 해 주셔서 고맙습니다. 이 응용 프로그램은 이미지에 대한 빠른 액세스가 필요하므로 옵션으로 파일/coredata에 저장하는 것을 생각하지 않았습니다.이 점을 반영하기 위해 질문을 업데이트했습니다. – Vlad

+0

왜 그 이유는 무엇입니까? 코드) 나는 하나의 배열에 모든 이미지를 저장하는 디자인이 좋은 생각이 아니라고 생각한다. 각 이미지 공간을 항상 할당해야하는 이유는 무엇입니까? 이미지를 저장하고 가져 가면 이미지를 가져 와서 작업을 완료하면 다시 가져옵니다 (dealloc). 이미지를 읽는 액세스 시간은 앱 속도에 해를 끼치 지 않을 가능성이 큽니다. – Max

답변

2

예 많은 이미지를 가변 배열에 저장하면 사용 가능한 많은 메모리를 사용합니다. 또한 핵심 데이터에 대해 생각할 수 있습니다. 하지만 런타임에 느린 기능이 발생하여 핵심 데이터에서 데이터를 저장 및 검색하지만 메모리 사용에 대해서는 안전합니다.
이러한 시나리오에서는 항상 다음 기능을 사용하는 것이 좋습니다. 모든 이미지를 문서 디렉토리에 캐시하고 URL (파일 위치) 경로를 코어 데이터 (또는 다른 데이터베이스)에 보관합니다. 이제 프리젠 테이션 시간에 나는 현재 이미지, 이전 이미지 및 다음 이미지를 저장에서 3 개의 이미지를 가져 왔습니다. 내가 현재 이미지를 보여줄 때마다 사용자는 스크롤 할 수 있으며 다음 또는 이전 이미지를 부드럽게 볼 수 있습니다. 사용자가 다음 이미지로 이동하면 내 세 이미지가 바뀝니다. 현재 이미지는 현재 이전 이미지이고, 다음 이미지는 현재 이미지이고 다음 이미지가 될 저장 위치에서 새 이미지를로드합니다. 그래서 모든 이미지를 루프에 넣었고 우리는 단지 3 개의 이미지 만 사용하여이 루프를 처리합니다.

+0

코어 데이터에 이미지를 쓰는 대신 캐시 디렉토리에 이미지를 저장하고 더 이상 필요하지 않을 때 이미지를 삭제하십시오. 이 디렉토리는 시스템에서 정리됩니다. Core Data 나 SQLite에 임시 이미지 데이터를 쓰는 것은 속도가 느립니다. 특히 바뀌는 바이너리/이미지 데이터의 경우 더욱 그렇습니다. – Kerni

+0

글쎄, 아직 코어 데이터, SQLite 및 문서 디렉토리 안에 blob 파일을 작성/검색하는 성능을 확인하지 못했습니다. 난 그냥 애플 리케이션을 실행하는 동안 메모리 사용에 대한 우려에 내 대답을 써주세요. 어쨌든 나는 질문자에게 blob 파일을 저장하기위한 문서 디렉토리 옵션을 언급한다. @Kerni – Tirth

+0

@iAmbitious 파일 시스템 대신 핵심 데이터 (또는 다른 데이터베이스) 내부의 이미지를 캐싱하면 성능이 떨어지고 경우에 따라 메모리 사용량이 크게 증가합니다. – bbum

1

동일한 문제가있었습니다. 여러 가지 시도, 결국 NSData 개체의 배열을 저장하고 비행 중에 UIImage로 변환하는 것에 부딪쳤다.

for (NSString *imageFile in directoryList) { 
    NSString *fileLocation = [imageFolder stringByAppendingPathComponent:imageFile]; 
    NSData *imageData = [NSData dataWithContentsOfFile:fileLocation]; 
    if (imageData) { 
     [images addObject:imageData]; 
    } else { 
     [Util trace:@"cannot get image data for image named: %@", fileLocation]; 
    } 

다음 이미지 업데이트 : 내가 엑스 코드에 익숙하지 않다 동안

-(void)updateImageView:(id)sender 
{  
    UIImage *anImage = [UIImage imageWithData:[images safeObjectAtIndex:nextImage] ]; 
    [imageView setImage:anImage]; 
    nextImage++; 
} 
관련 문제