2

내 iPad에서 이미지를 캐 러셀에로드하는 응용 프로그램을 실행 중입니다. 총 138 개의 이미지가 있습니다. 그 수를 100으로 줄이면 응용 프로그램이 잘로드됩니다. 그러나 138에서, 애플리케이션은 충돌보다는 일시 정지한다.메모리 문제 또는 다른 것이 있습니까?

중단 점으로 표시된 것처럼 viewDidLoad 및 첫 번째 for 문에 도달했습니다. 문제는 두 번째 for 문에 있습니다.

// loading images into the queue 

loadImagesOperationQueue = [[NSOperationQueue alloc] init]; 
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithCapacity:14]; 

for (int i = 0; i < 137; i++) { 
    [tmpArray addObject:[NSString stringWithFormat:@"cover_%d.jpg", i]]; 
} 

for (int i = 0; i < 137; i++) { 
    int index = arc4random() % [tmpArray count]; 
    NSString *imageName = [tmpArray objectAtIndex:index]; 
    [tmpArray removeObjectAtIndex:index]; 
    [(AFOpenFlowView *)self.view setImage:[UIImage imageNamed:imageName] forIndex:i]; 
} 

내가 ARC로에서 iOS 5를 사용하고 있기 때문에 내가 수동 메모리 관리를 수행 할 필요가 없습니다 있지만, 메모리 문제가 있음을 추측하고있어.

메모리에 보관 될 가능성이 있습니까? @ 138 KB 당 138 이미지입니다. 대략 20MB이지만, 혼자서 문제가 발생할 수 있다고 생각하지 않습니다.

GDB는 유용한 출력없이 종료되며 실제로는 출력이 없습니다. 장비를 실행하면 일시 정지가 발생하면 실제 메모리 사용량은 6.11MB (77.4 % CPU)이지만 175MB (가상 메모리)가 소요됨을 알 수 있습니다.

나는 메모리 경고 또는 실제 충돌이 없다는 사실에 우려하고 있습니다. 스레드가 일시 중지되고 자동으로 다시 시작되거나 종료 될 수 없기 때문에 xcode 내에서 종료해야합니다.

답변

5

너무 많은 메모리가 필요하기 때문에 응용 프로그램이 죽는 것처럼 보입니다. 사실, 20MB는 제가 경험 한 한계이며, 이것은 또한 당신이 검색을 통해 찾을 수있는 것과 같습니다.

메모리 경고 메시지가 표시되지 않는 것은 주 루프에 제어권을 반환하지 않는 고정 루프의 이미지를 메모리에로드하기 때문에 발생합니다. 따라서 메시지 didReceiveMemoryWarning을받을 기회가 없습니다.

솔루션은 매우 간단하며 많은 이미지를 미리로드하고 회전식 슬라이드를 통해 이동할 때 더 많은 이미지를 미리로드하고 이전 이미지는 풀어줍니다. 실제로, 볼을 계속 움직이기 위해 언제든지 5 개 이상의 이미지를 메모리에 저장할 필요는 없습니다. 이미지를 거의 매번로드 할 필요가 없다고 염려하면 그 수를 늘릴 수 있습니다.

+0

또한 이러한 138 개의 이미지는 디스크의 압축 파일 크기 인 ~ 146KB보다 메모리에서 비 압축 비트 맵으로 더 많은 메모리를 차지할 것입니다. –