身为小白的我这个问题困扰我很久.工程写出来以后,模拟器根本不会发现问题所在(貌似电脑内存足够大).当你在真机测试使用的时候你就会发现Cell快速滑动,数据量大(图片数量)的时候app就会被系统Crash. 废话就不多说了,直接说本人解决过程吧.!!!
方向1: 从图片入手
方向2: 工程UITableView优化
方向3: SDWebImage优化
方向1: 从图片入手
很多人都会忽略这个问题 都会往自己的代码工程这个方向去考虑 问题. 其实图片影响非常大. 如果图片质量2M,3M图片你直接放到cell上展示.不用想了 肯定是会卡成狗. 渲染这样的图片肯定需要很大内存. 所以往往你在开发的时候<<要跟后台商量.获取图片划分两个地址.一个地址获取缩略图,一个地址获取原图>> 这样你就可以在TableViewCell使用缩略图(展示用),点击图片查看(使用原图). 这样就大大减少了内存的使用.
方向2: 工程UITableView优化
这个普遍大家都会去关注使用的起来差不多!!
1 高度缓存, cell 重用.. (不用说)
2 缓存Cell UI数据 比如高度 减少计算 (Model去缓存,或者使用工具SDAutoLayout)
3 Cell减少重复创建View (懒加载 一般cell局部规格都不一样都是根据数据来适配view<比如朋友圈> 所以你可以先创建好view放进数组 根据图片数组的长度获取view的个数去展示view ) 下面是我用SDAutoLayout代码
方向3: SDWebImage优化
SDWebImage 使用
到这里一般的数据足够使用 但是图片数量大的依旧内存会出现问题 接下就参考网上的一篇博客 完美解决问题
博客地址: http://blog.csdn.net/benyoulai5/article/details/50462586
SDWebImage 优化
1 找到这个位置
复制 复制到上面文件中去实现第一步方法
+(UIImage *)compressImageWith:(UIImage *)image
{
float imageWidth = image.size.width;
float imageHeight = image.size.height;
float width = 640;
float height = image.size.height/(image.size.width/width);
float widthScale = imageWidth /width;
float heightScale = imageHeight /height;
// 创建一个bitmap的context
// 并把它设置成为当前正在使用的context
UIGraphicsBeginImageContext(CGSizeMake(width, height));
if (widthScale > heightScale) {
[image drawInRect:CGRectMake(0, 0, imageWidth /heightScale , height)];
}
else {
[image drawInRect:CGRectMake(0, 0, width , imageHeight /widthScale)];
}
// 从当前context中创建一个改变大小后的图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// 使当前的context出堆栈
UIGraphicsEndImageContext();
return newImage;
}
第二步
这样基本解决内存问题 具体解释可以参考上面博客!!!