内存在 UITableViewCell 中增长
Memory growing in UITableViewCell
我的自定义单元格代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ImageView"];
NSURL *nsurl = [NSURL URLWithString:_imageUrls[indexPath.row]];
NSData *data = [NSData dataWithContentsOfURL: nsurl];
cell.imageView.image = [UIImage imageWithData:data];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ImageView"];
}
return cell;
我有自定义 class VKTableViewCell:
@interface VKTableViewCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UIImageView *image;
@end
图片大约为 800x800(从网站解析)。
当我滚动我的 table 时,内存在增长(从 20 到 30mb,加载 100 张图像)。为什么会这样?在这种情况下我必须做什么?我正在使用 ARC。
您正在主线程上进行网络调用,这就是它同时做两件事的原因
渲染 UITableView 单元格
为图像进行网络调用
Now You have to shift your Network call logic from Main Thread to BackGround Thread
dispatch_queue_t callerQueue = dispatch_get_current_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("com.myapp.processsmagequeue", NULL);
dispatch_async(downloadQueue, ^{
NSData * imageData = [NSData dataWithContentsOfURL:url]; //Make Network call on BackGround Thread
dispatch_async(callerQueue, ^{
// Assign Your Image to UIimageView of Cell here on Main Thread
[cell setNeedsLayout]; // To Refresh Cell
});
});
也可以使用第三方ApiAFNetWorking or SDWebImage
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];
新解:
延迟加载 UITableViewCell 中的所有图像,只需制作如下所示的 UIImageView 扩展
extension UIImageView {
func downloadImageFrom(_ link:String, contentMode: UIView.ContentMode) {
guard let url = URL(string: link) else {
return
}
URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
guard let `self` = self else { return }
DispatchQueue.main.async {
self.contentMode = contentMode
self.image = UIImage(data: data ?? Data())
}
}.resume()
}
}
函数调用:
cell.imageView.image = UIImage(named: "placeholder") //set placeholder image first.
cell.imageView.downloadImageFrom(link: dataSource[indexPath.row], contentMode: UIViewContentMode.ScaleAspectFit) //set your image from link array.
我的自定义单元格代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ImageView"];
NSURL *nsurl = [NSURL URLWithString:_imageUrls[indexPath.row]];
NSData *data = [NSData dataWithContentsOfURL: nsurl];
cell.imageView.image = [UIImage imageWithData:data];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ImageView"];
}
return cell;
我有自定义 class VKTableViewCell:
@interface VKTableViewCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UIImageView *image;
@end
图片大约为 800x800(从网站解析)。 当我滚动我的 table 时,内存在增长(从 20 到 30mb,加载 100 张图像)。为什么会这样?在这种情况下我必须做什么?我正在使用 ARC。
您正在主线程上进行网络调用,这就是它同时做两件事的原因
渲染 UITableView 单元格
为图像进行网络调用
Now You have to shift your Network call logic from
Main Thread to BackGround Thread
dispatch_queue_t callerQueue = dispatch_get_current_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("com.myapp.processsmagequeue", NULL);
dispatch_async(downloadQueue, ^{
NSData * imageData = [NSData dataWithContentsOfURL:url]; //Make Network call on BackGround Thread
dispatch_async(callerQueue, ^{
// Assign Your Image to UIimageView of Cell here on Main Thread
[cell setNeedsLayout]; // To Refresh Cell
});
});
也可以使用第三方ApiAFNetWorking or SDWebImage
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];
新解:
延迟加载 UITableViewCell 中的所有图像,只需制作如下所示的 UIImageView 扩展
extension UIImageView {
func downloadImageFrom(_ link:String, contentMode: UIView.ContentMode) {
guard let url = URL(string: link) else {
return
}
URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
guard let `self` = self else { return }
DispatchQueue.main.async {
self.contentMode = contentMode
self.image = UIImage(data: data ?? Data())
}
}.resume()
}
}
函数调用:
cell.imageView.image = UIImage(named: "placeholder") //set placeholder image first.
cell.imageView.downloadImageFrom(link: dataSource[indexPath.row], contentMode: UIViewContentMode.ScaleAspectFit) //set your image from link array.