2015-01-05 1 views
4

Я использую SDWebImage для загрузки изображения async с сервера. Некоторые изображения на сервере имеют размер от 1,5 до 2. MB.I'm показ этих изображений на 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 пикселей) .Для примера один из них имеет 4256 * 2832 и размер 979KB производят предупреждение о памяти. Любая помощь или предложение будут оценены. EDIT: - мое приложение убивается из-за давления памяти, но только на iPhone 4 и более низкие версии (отлично работает на iPhone 5 и выше). Когда большое изображение загружается (или полная загрузка), я получил внезапную память шип (от ~ 25 мб до ~ 90 мб) и сбоев приложений. Любое предложение, что делать?

+0

Это намного проще, если вы обнаружите, где он сбой, и если вы можете опубликовать информацию о возвращении от отладчика, когда вы столкнулись с крахом (журнал сбоев с трассировкой стека) – Volker

+1

Нет журнала сбоев, только в окне Xcode появляется окно с сообщением об ошибке приложение неожиданно прекратилось (iOS закрыл приложение из-за высокой памяти) – Bharat

+0

Я публикую эту проблему на странице SDWebImage Github. Чтобы привлечь внимание от своего разработчика. –

ответ

3

Похоже, ваше приложение убито из-за давления памяти. Проверьте Instruments, где именно память увеличивается, и, возможно, попробуйте использовать Autorelease Pool для уменьшения всплесков памяти.

+0

Да, мое приложение убивается из-за давления памяти, но только на iPhone 4 и более низких версиях. Когда загружается большое изображение, я получил внезапный всплеск памяти (от ~ 25 до 90 мб) и сбои приложений. Любое предложение обрабатывать это. – Bharat

+0

Как я уже сказал, использование пула автообновлений поможет справиться с всплесками памяти. Обычно вы переносите выделение изображения, особенно если вы выделили пару изображений за короткий период, например. в петле. – dlinsin

+0

Я использовал Autorelease, и теперь приложение вылетает после нескольких свитков. Теперь работаем над некоторыми алгоритмами оптимизации изображений на сервере. В любом случае, ваше предложение помогло мне ... благодаря тонне. – Bharat

2

Да, @dlinsin абсолютно прав. Это определенно проблема памяти.

Надеюсь, вы не используете то же изображение 2mb, что и миниатюра. если да, то почему вы рушитесь. Пожалуйста, используйте изображения с более низким разрешением в виде больших пальцев и показывайте большие, когда пользователь запрашивает его.

Кстати, используйте это, чтобы узнать, не поможет ли это.

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