2015-01-05 1 views
4

서버에서 이미지 비동기를 다운로드하려면 SDWebImage을 사용하고 있습니다. 서버의 이미지 크기는 ~ 1.5 ~ 2MB입니다.이 이미지를 UICollectionView에 표시하고 있습니다. 몇 번 실행하면 메모리 경고 및 응용 프로그램 충돌이 발생합니다. 처음에는 이미지를 처음 다운로드하고 컬렉션보기를 위아래로 스크롤하면 약간의 시간이 걸립니다. 다음은 내 코드 -SDWebImage를 사용하여 큰 이미지를 다운로드하는 중 앱이 다운 되나요?

-(void)setImageWithUrl:(NSURL*)imgurl onImageView:(UIImageView*)image prograssive:(BOOL)progressive 
{ 
    __block UIActivityIndicatorView *activityIndicator; 
    __weak UIImageView *weakImageView = image; 
    SDWebImageOptions opt; 
    if (progressive) { 

     opt = SDWebImageProgressiveDownload; 
    } 
    else 
     opt = SDWebImageRetryFailed; 
    [image sd_setImageWithURL:imgurl placeholderImage:[UIImage imageNamed:@"default_image"] options:opt progress:^(NSInteger receivedSize, NSInteger expectedSize) 
    { 
     if (!activityIndicator) 
     { 
      [weakImageView addSubview:activityIndicator = [UIActivityIndicatorView.alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]]; 
      activityIndicator.center = CGPointMake(weakImageView.frame.size.width /2, weakImageView.frame.size.height/2); 
      // activityIndicator.center = weakImageView.center; 
      [activityIndicator setBackgroundColor:[UIColor clearColor]]; 
      [activityIndicator startAnimating]; 
     } 
    } 
        completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) 
    { 
     [activityIndicator removeFromSuperview]; 
     activityIndicator = nil; 
    }]; 
} 

AppDelegate에 -

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
{ 

    [[SDImageCache sharedImageCache] clearMemory]; 
    [[SDImageCache sharedImageCache] cleanDisk]; 
    [[SDImageCache sharedImageCache] clearDisk]; 
    [[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"]; 
} 

하시기 바랍니다없는 이미지를 고해상도 (3000 개 이상의 픽셀 폭) .FOR 그 중 하나가 4256 * 2832와 크기를 가지고 예이다 979KB는 메모리 경고를 생성합니다. 모든 도움이나 제안을 부탁드립니다. 편집 : - 내 앱이 메모리 부족으로 인해 죽어 가고 있지만 iPhone4 이하 버전에서만 작동합니다. (iPhone5 이상에서 정상적으로 작동합니다.) 큰 이미지를 다운로드하거나 다운로드를 완료하면 갑작스런 메모리가 있습니다. 스파이크 (~ 25MB에서 ~ 90MB로 이동) 및 앱 충돌. 어떤 제안을해야합니까?

+0

크래시가 발생한 위치를 표시하고 크래시가 발생했을 때 디버거의 정보를 게시 할 수있는 경우 (스택 추적이있는 크래시 로그) – Volker

+1

크래시 로그가 없으면 Xcode에 메시지 창이 나타납니다 앱이 예기치 않게 중지되었습니다 (iOS에서 메모리 사용량이 많아 앱이 종료 됨). – Bharat

+0

SDHebImage Github 페이지에이 문제를 게시합니다. 그것의 개발자로부터주의를 끌기 위해서. –

답변

3

메모리 압력으로 인해 앱이 종료되는 것 같습니다. Instruments에서 정확히 메모리가 증가하는 곳을 확인하고 Autorelease Pool을 사용해 메모리 스파이크를 완화 해보십시오.

+0

예, 메모리 압박으로 인해 앱이 강제 종료되지만 iPhone 4 이하 버전에서만 발생합니다. 큰 이미지를 다운로드 할 때 갑자기 메모리 스파이크 (~ 25MB ~ 90MB)가 발생하고 앱이 다운되는 경우가 있습니다. 이. – Bharat

+0

내가 제안한 것처럼 Autorelease Pool을 사용하면 메모리 스파이크를 처리하는 데 도움이됩니다. 일반적으로 이미지 할당을 감쌀 수 있습니다. 특히 짧은 시간에 두 장의 이미지를 할당하는 경우 특히 그렇습니다. 루프. – dlinsin

+0

몇 가지 scrolls.Now 서버에서 일부 이미지 최적화 알고리즘에 대한 작업 후 지금은 Autorelease를 사용하여 응용 프로그램이 충돌합니다. 어쨌든 당신의 제안은 나를 도왔습니다. – Bharat

2

예, @dlinsin은 절대적으로 적합합니다. 이것은 확실히 메모리 문제입니다.

동일한 2MB 이미지를 미리보기 이미지로 사용하지 않기를 바랍니다. 그렇다면 크래쉬하는 이유입니다. 저해상도 이미지를 엄지 손가락으로 사용하고 사용자가 요청할 때 큰 이미지를 표시하십시오.

그건 그렇고 도움이 될지 확인하기 위해 이것을 사용하십시오.

[[SDImageCache sharedImageCache] setShouldDecompressImages : NO]; [[SDWebImageDownloader sharedDownloader] setShouldDecompressImages : NO];

관련 문제