iOS 同一页面加载上百张图片,迅速滑动时导致内存暴涨程序崩溃的参考解决方法
2017-12-05 18:08
633 查看
本例中项目大致流程是先由客户端拍照或者选择图库中的图片进行上传,然后可以从详情页面中浏览所有上传的图片,由于图片是按照相册进行分类,而每个相册中最多可以有50张照片,极限的情况是详情页面最多可以有20多个相册,由此导致需要对图片的加载进行必要的优化,避免程序占用内存过多导致程序崩溃
优化思路如下:
1、限制图片缓存占用的最大内存数
设置SDWebImage中imageCache的setMaxMemoryCountLimit
2、控制器视图滑动开始时对图片处理线程的监管,以及对图片缓存所占用的内存的清理
在加载图片的控制器中,当页面开始滑动时暂停SDWebImage中所有任务的执行(取消掉当前所有的下载图片的operation),并且清除内存中的图片缓存,再将滑动状态结束的标志位置为No,此标志位用于加载图片时的相关操作,即第4步操作
3、控制器视图滑动结束时对相册的操作
控制器滑动结束时,将代表滑动结束的标志位置为YES,并将视图可见范围内的相册重新加载图片
4、加载图片时的管理
加载图片时,根据控制器视图的滑动状态选择展示缩略图还是清除image,减小程序运行压力
描述或解决不当之处,欢迎大家批评指正
优化思路如下:
1、限制图片缓存占用的最大内存数
设置SDWebImage中imageCache的setMaxMemoryCountLimit
[[SDWebImageManager sharedManager].imageCache setMaxMemoryCountLimit:15]; //imageCache为SDWebImageManager中的独立缓存单元
2、控制器视图滑动开始时对图片处理线程的监管,以及对图片缓存所占用的内存的清理
在加载图片的控制器中,当页面开始滑动时暂停SDWebImage中所有任务的执行(取消掉当前所有的下载图片的operation),并且清除内存中的图片缓存,再将滑动状态结束的标志位置为No,此标志位用于加载图片时的相关操作,即第4步操作
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ self.isEndDecelerating = NO; NSLog(@"scrollViewWillBeginDragging-----"); [SDWebImageManager.sharedManager cancelAll]; [SDWebImageManager.sharedManager.imageCache clearMemory]; }
3、控制器视图滑动结束时对相册的操作
控制器滑动结束时,将代表滑动结束的标志位置为YES,并将视图可见范围内的相册重新加载图片
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { self.isEndDecelerating = YES; NSLog(@"scrollViewDidEndDecelerating-----"); NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows]; for (NSIndexPath *indexPath in visiblePaths) { switch (indexPath.row) { case 21: { HeadPhotoCell * cell = (HeadPhotoCell *)[self.tableView cellForRowAtIndexPath:indexPath]; [cell.album reloadData]; } break; ... ... default: ... break; } } }
4、加载图片时的管理
加载图片时,根据控制器视图的滑动状态选择展示缩略图还是清除image,减小程序运行压力
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { CDCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CDCollectionCell" forIndexPath:indexPath]; NSString * imgUrl = [self.totalArray objectAtIndex:indexPath.section][indexPath.row]; NSString * urlStr = [NSString stringWithFormat:@"%@/%@?width=30&height=30",ImageServerUrl,imgUrl]; if(self.parentViewCtrl.isEndDecelerating) { [cell.imageView sd_setImageWithURL:[NSURL URLWithString:urlStr]]; }else{ cell.imageView.image = nil; } return cell; }
描述或解决不当之处,欢迎大家批评指正
相关文章推荐
- flash ios 加载图片序列内存过大的解决方法
- iOS开发 - 完美解决SDWebImage加载多个图片内存崩溃的问题
- Android 加载图片内存溢出解决方法
- iOS开发,利用文件流,算大文件的MD5值(程序不会导致内存崩溃)
- Android 加载图片内存溢出解决方法
- iOS 加载大量高清图片, 内存警告导致crash
- C# Webbrowser使用加载页面多少了内存泄露问题解决方法汇总
- 解决加载图片内存溢出问题的方法
- Android---加载图片 解决图片过大导致的内存溢出问题
- Android加载图片内存溢出问题解决方法
- 【iOS知识学习】_tableview滑动时图片加载缓慢解决办法
- open和add file to project功能导致VC++6.0程序崩溃的解决方法
- SDWebimage 加载大量图片的时候内存泄露的解决方法(ios自学笔记)
- 完美解决SDWebImage加载多个图片内存崩溃的问题
- IOS 图片加载过多导致内存警报的释放内存操作
- Android 加载图片内存溢出解决方法 (java.lang.outOfMemoryError:....)
- 关于自定义tabbar解决maincontroller加载多个subcontroller而导致内存不足的解决方法
- 没有网络连接时程序崩溃问题以及动态加载图片问题已解决
- ios开发之webView.scalesPageToFit = YES后 加载页面遇见表格显示很小的解决方法
- Android加载图片内存溢出问题解决方法