각 페이지에 이미지가있는 페이징 된 슬라이더보기가 있습니다. 프로그램이 실행되는 동안 서버에서 이미지를 다운로드 할 수 있도록 NSOperationQueue
을 사용하고 있습니다.메모리 누수 서버에서 이미지 다운로드
[self performSelectorOnMainThread:@selector(loadPic:) withObject:[NSArray arrayWithObjects:[self imageWith:[picsNames objectAtIndex:imageView.tag]], [NSString stringWithFormat:@"%d", imageView.tag], nil] waitUntilDone:YES];
다음 메소드를 호출 :
-(void)loadPic:(NSArray *)imageAndTagArray
{
if (imageAndTagArray.count) {
//loading the image to imageview
UIImageView *imageView = (UIImageView *)[scrollView viewWithTag:[[imageAndTagArray objectAtIndex:1] intValue]];
imageView.image = [UIImage imageWithData:((NSData *)[imageAndTagArray objectAtIndex:0])];
//stopping the indicator
[((UIActivityIndicatorView *)[imageView viewWithTag:ACTIVITY_INDICATOR_TAG]) stopAnimating];
}
}
을 scrollerview에 다운로드 한 이미지를 표시 할 수
NSOperationQueue
다음 메소드를 호출하는
-(NSData *)imageWith:(NSString *)imageName
{
NSString *imagePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:imageName];
NSData *imageData = [NSData dataWithContentsOfFile:imagePath];
if (!imageData) {
imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[[NSString stringWithFormat:@"%@/%@", picsURL,imageName] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]];
if (imageData) {
[imageData writeToFile:imagePath atomically:YES];
}
}
return imageData;
}
을 사용하고 내가 메인 스레드를 사용
모든 것이 처음 60 개의 이미지에는 잘 작동하지만 이후에는 메모리 경고가 표시되고 약 100 개의 이미지가 지나면 앱이 다운됩니다.
나는 이것에 너무 많은 시간을 보내고 있으며 무엇을해야 할지를 알 수 없다. 나는 Instruments를 사용했고 어떤 누출도 감지하지 못했습니다. 나는 또한 Analyze를 사용했고 그 중 하나도 보여주었습니다.
편집 : 5.jpg 로컬 이미지 난 여전히 경고를 얻을 다음과 같은 정의와 방법 정의 :
나는 imageWith를 교체 할 경우
.-(NSData *)imageWith:(NSString *)imageName
{
return UIImagePNGRepresentation([UIImage imageNamed:@"5.jpg"]);
}
상황에 대해 자세히 설명해 드리겠습니다.
앱이 시작되면 페이지 당 9 개의 이미지가 포함 된 페이지 된 스크롤보기가 포함 된보기가 있습니다. scrollview는 nsoperationqueue를 사용하여 imageWith : 메소드를 호출하는 이미지를로드합니다.
사용자가 두 번째보기에서 열리는 이미지 중 하나를 누르면 두 번째 이미지가 전체 이미지로 표시됩니다. 이 두 번째보기에는 첫 번째보기와 동일한 이미지가 포함되지만 전체 화면 (페이지 당 1 이미지)을 포함하는 스크롤보기도 있습니다.
두 번째보기에서 약 60 개의 이미지를로드 한 후 앱을 앞뒤로 스크롤하면 충돌이 발생합니다. 50 개의 이미지를로드 한 다음 뒤로 버튼을 누르고 첫 번째보기로 이동 한 다음 다른 이미지를 누르고 두 번째보기로 이동하여 약 10 개의 이미지를로드하면 충돌이 발생합니다.
자동 참조 계산을 사용하고 있습니까? –
당신은 너무 많은 기억을 지닐 수 있습니다. 이미지 뷰에서 설정 한 이미지를 해제합니까 (예 : 사용자가 스크린에서 스크롤 할 때)? – Tim
예 xCode에서 자동 참조 계산을 사용하고 있습니다. 4.6 – Mona