在使用,SDWebImage加载图片的时候,出现图片加载混乱,具体情况是
1> 从服务器获取数据,如果返回的数组有数据即图片地址,则没有问题,如果数组为空那么,这个空数组展示的cell则会出现图片加载紊乱。
2> 我用的SDWebImage加载图片的方法是: [backgImgView sd_setImageWithURL:[NSURL URLWithString:propertyImgs[i]] placeholderImage:[UIImage imageNamed:[Utils imageNameStr:@"PlaceHolder"]]];
具体使用到的函数:
for (int i = 0; i < propertyImgs.count; i++) {
UITapGestureRecognizer *backgImgViewTapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backgImgViewTapGRAction:)];
backgImgViewTapGR.numberOfTapsRequired = 1;
// backgImgViewTapGR.numberOfTouchesRequired = 1;
UIImageView *backgImgView = [[UIImageView alloc] init];
backgImgView.userInteractionEnabled = YES;
[backgImgView addGestureRecognizer:backgImgViewTapGR];
[backgImgView sd_setImageWithURL:[NSURL URLWithString:propertyImgs[i]] placeholderImage:[UIImage imageNamed:[Utils imageNameStr:@"PlaceHolder"]]];
backgImgView.frame = CGRectMake(i*Kwidth, 0, Kwidth, scrollContainerView.frame.size.height);//i*Kwidth
[scrollContainerView addSubview:backgImgView];
lastImgView = backgImgView;
}
题主这个问题让我很疑惑,题主写的这个列表视图,可能使用了用
tableView
,在cell中嵌套了ScrollView
,所以我觉得题主可能是在做一个Cell可以横向滑动的滚动tableView,如果真是这样的话,题主这段加载UIImageView的代码可能是在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法里,代码篇幅有限,不知道题主有没有在每次执行这段代码前,移除scrollContainerView
中旧的ImageView
。UITableViewCell是有复用机制的,可以有效节省内存开销。所谓的复用机制,就是我们使用的
生成的cell,其实不一定是一个新实例,例如你当前屏幕总共可以显示3个cell(如你的图),那你的内存中,可能只有4个cell实例,在不停的循环调用。
所以当你的服务器出现返回空数组的情况时,for循环不执行,但是
scrollview
中的别的数组的图还在内存中并未清除,所以出现了你所谓的混乱。如果返回不空,你新创建的UIImageView覆盖了旧的,所以看起来是对的,但是内存在不断增加没有释放。
解决办法:你自己想吧,我也不清楚你完整的代码,只是猜测一下原因。提亮点建议
1 你的
scrollContainerView
在for循环前面,把所有UIImageView
移除掉。2 更好的办法是,好好研究一下复用机制,参考著名的
nimbus
框架的NIViewRecycler类,或者直接拿来用,把你的UIImageView
也复用了。可能需要花点时间,但弄明白以后绝对值得。ps:这个问题跟
SDWebImage
半毛钱关系都没有。